PHP como implementar o padrão Mapeador de dados em MVC

Estou a tentar implementar e perceber o padrão do Mapeador de dados no meu projecto de MVC. Sei que isto já foi perguntado antes, mas ainda não sei se estou a ir na direcção certa. Colei o meu controlador, o Datamapper e o código objecto/entidade do domínio logo abaixo:

controlador

o utilizador aterra em mywebsite.com/dashboard/index e pode ver uma lista de eventos a partir da tabela de banco de dados de log de eventos. A função index () cria uma instância de Aplicação de dados e passa pelo papel da base de dados. Em seguida, uma tabela HTML é gerada dinamicamente com dados obtidos a partir do Mapeador de dados.

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

Esta classe contém o método findByLimit() para obter os últimos 20 eventos logísticos da base de dados. O método fetchCollection () popula as Entidades de domínio e as recolhe em uma matriz para ser devolvida ao controlador.

devo criar uma função genérica de recolha a ser usada por vários mapeadores de dados quando a pesquisa SQL devolve várias linhas (=vários objectos de domínio)? E um mapeador de dados pode usar qualquer tipo de fonte de dados?

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);
    }   
}

Objecto/Entidade Do Domínio

Finalmente o objecto do domínio com alguns getters e setters simples. Este seria o lugar para fazer a validação das propriedades de um objeto de domínio?

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
}
Estou a perder alguma coisa na minha implementação?

Author: Beeelze, 2016-06-01

1 answers

Devo criar uma função genérica de recolha a ser usada por vários mapeadores de dados quando a pesquisa SQL devolve várias linhas (= múltiplos objectos de domínio)?

Não. Se os seus obetos tiverem propriedades que são 1=1 com colunas da tabela db, então use uma abordagem existente; por exemplo, classe DOP-FETCH. De qualquer forma, é mais limpo ter um mapeador por entidade. Se eles são muito genéricos, então use o" super " mapper.

E um mapeador de dados pode usar qualquer tipo de dados Fonte?

Assumindo que {[[0]} é algum tipo de interface de leitura-escrita de colecção, então certamente. Você tem __construct(Database $dbh), que pode ser substituído por __construct(DataSource $ds).

Outras notas: tente injectar a base de dados e o serviço mapper no controlador.

 0
Author: Ярослав Рахматуллин, 2016-06-01 16:02:01