구현하고 내 MVC 프로젝트의 데이터 매퍼 패턴에 대한 이해를 얻으려고합니다. 나는 이것이 전에 물어 보았다는 것을 알고 있지만, 나는 올바른 방향으로 나아가고 있는지 확실하지 않다. 나는 붙여 넣은 내 컨트롤러, Datamapper 오른쪽 아래에 도메인 개체/엔티티 코드 :PHP MVC에서 데이터 매퍼 패턴을 구현하는 방법
컨트롤러
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 쿼리가 여러 행 (= 복수 도메인 개체)을 반환 할 때 여러 데이터 매퍼가 사용할 일반 컬렉션 함수를 만들어야합니까? 데이터 매퍼는 모든 유형의 데이터 소스를 사용할 수 있습니까? 몇 가지 간단한 getter와 setter와 마지막 도메인 개체에서
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);
}
}
도메인 개체/엔티티
합니다. 도메인 객체의 속성에 대한 유효성 검사를 수행 할 장소입니까?
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
}
구현시 뭔가가 누락 되었습니까?
사양을 알 수 없습니다. 당신이 빠진 것을 말하기가 어렵습니다. 나는 기존의 ORM 구현을 내 자신을 굴리는 대신에 보게 될 것이다. –
@ ЯрославРахматуллин 나는 대부분의 ORM 구현이 과잉이되었고, 너무 많은 사람들이 많은 다른 것들을 원한다. ORM은 모든 것을 똑같이 훌륭하게 수행 할 수는 없으며 단지 몇 가지만 수행 할 수 있습니다. – dbf
그래, 복잡한 ORM 구현이 필요하지 않습니다. 다른 프레임 워크/구현에서 배우고 내 자신의 비트를 작성함으로써 가장 많이 배웁니다. – Beeelze