PHP如何在MVC中实现Data Mapper模式

我试图在我的MVC项目中实现并掌握Data Mapper模式。 我知道这已经被问过,但我仍然不确定我是否正朝着正确的方向前进。 我在下面粘贴了我的Controller,Datamapper和Domain Object / Entity代码:

调节器

用户登陆mywebsite.com/dashboard/index并从事件日志数据库表中查看事件列表。 index()函数创建一个Datamapper实例并传递数据库包装器。 然后,使用从数据映射器获取的数据动态生成HTML表格。

class DashboardController extends BaseController { 
    public function index() {
        require_once '../app/domain/mappers/EventMapper.php';
        require_once '../app/include/HTMLTableCreator.php';

        try {
            $eventMapper = new EventMapper(new Database('db'));
            $table = new HTMLTableCreator($eventMapper->findByLimit(20));
        } catch (DatabaseException $e) {

        }

        $this->view('/home/dashboard', ['table' => $table->toString()]);
    }   
}

的DataMapper

该类包含用于从数据库中检索最近20个日志事件的findByLimit()方法。 fetchCollection()方法填充域实体并将它们收集到数组中以返回给控制器。

我应该在SQL查询返回多行(=多个域对象)时创建一个泛型集合函数供多个数据映射器使用吗? 数据映射器可以使用任何类型的数据源吗?

require_once '../app/domain/entities/Event.php';
require_once '../app/domain/interfaces/EventMapperInterface.php';

/**
 * EventMapper class
 */
class EventMapper implements EventMapperInterface {

    protected $dbh;
    protected $elements;

    public function __construct(Database $dbh) {
        $this->dbh = $dbh;
    }

    public function fetchCollection($objects) {
        foreach($objects as $object) {
            $event = new Event();
            $event->setId($object['id']);
            $event->setDateTime($object['datetime']);
            $event->setMessage($object['message']);
            $event->setHostname($object['hostname']);

            $this->elements[] = $event;
        }

        return $this->elements;
    }

    public function findByLimit($limit = 20) {
        $events = $this->dbh->sql_select('SELECT * FROM eventlog LIMIT ' . $limit, []);

        return $this->fetchCollection($events);
    }   
}

域对象/实体

最后,域对象有一些简单的getter和setter。 这是否会对域对象的属性进行验证?

class Event {

    protected $id;
    protected $dateTime;
    protected $message;
    protected $hostname;

    public function setId($id) {
        $this->id = $id;
    }

    public function getId() {
        return $this->id;
    }

    public function setDateTime($dateTime) {
        $this->dateTime = $dateTime;
    }

    public function getDateTime() {
        return $this->dateTime;
    }  

    // rest omitted for clarity
}

我在执行中丢失了什么吗?


我应该在SQL查询返回多行(=多个域对象)时创建一个泛型集合函数供多个数据映射器使用吗?

不可以。如果你的obects的属性是db table列的1 = 1,那么使用现有的方法; 例如PDO-FETCH-CLASS。 无论如何,每个实体都有一个映射器会更清晰。 如果它们非常通用,那么使用“超级”映射器。

数据映射器可以使用任何类型的数据源吗?

假设DataSource是某种集合 - 读写接口,那么当然。 你有__construct(Database $dbh) ,可以用__construct(DataSource $ds)替换。

其他说明:尝试将数据库和映射器服务注入控制器。

链接地址: http://www.djcxy.com/p/56237.html

上一篇: PHP how to implement the Data Mapper pattern in MVC

下一篇: Zend Data Mapper design