2016-06-01 3 views
1

구현하고 내 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 
} 

구현시 뭔가가 누락 되었습니까?

+0

사양을 알 수 없습니다. 당신이 빠진 것을 말하기가 어렵습니다. 나는 기존의 ORM 구현을 내 자신을 굴리는 대신에 보게 될 것이다. –

+0

@ ЯрославРахматуллин 나는 대부분의 ORM 구현이 과잉이되었고, 너무 많은 사람들이 많은 다른 것들을 원한다. ORM은 모든 것을 똑같이 훌륭하게 수행 할 수는 없으며 단지 몇 가지만 수행 할 수 있습니다. – dbf

+0

그래, 복잡한 ORM 구현이 필요하지 않습니다. 다른 프레임 워크/구현에서 배우고 내 자신의 비트를 작성함으로써 가장 많이 배웁니다. – Beeelze

답변

0

SQL 쿼리가 여러 행 (= 복수 도메인 개체)을 반환 할 때 여러 데이터 매퍼가 사용할 일반 컬렉션 함수를 만들어야합니까?

아니요. obects에 db 테이블 열과 함께 1 = 1 인 속성이있는 경우 기존 방법을 사용하십시오. 예 : PDO- FETCH-CLASS. 어쨌든 엔티티 당 하나의 매퍼를 갖는 것이 더 깔끔합니다. 매우 일반적인 경우 "수퍼"매퍼를 사용하십시오.

데이터 맵퍼는 모든 유형의 데이터 소스를 사용할 수 있습니까?

DataSource은 일종의 수집 - 읽기 - 쓰기 인터페이스라고 가정하면 확실합니다. __construct(Database $dbh)이 있으며 __construct(DataSource $ds)으로 바꿀 수 있습니다.

기타 참고 사항 : 데이터베이스와 매퍼 서비스를 컨트롤러에 주입하십시오.

+0

저는 PDO 대신 mysqli를 사용하고 있습니다.그리고 컨트롤러의 생성자를 사용하여 데이터베이스와 매퍼 서비스를 주입 할 것입니까? 그런 다음 해당 컨트롤러 내의 모든 작업 메서드에는 해당 책임 매핑 원칙이 적용되어야한다고 가정해야합니다.이 매퍼는 단일 책임 원칙에 적용됩니다. – Beeelze

+0

기존 IoC 컨테이너를 살펴 보시겠습니까? 나는 주변을 둘러 보았고 몇 가지 구현을 발견했다. 그런 컨테이너를 어디에서 초기화할지 모르겠다.하지만 그건 내가 생각하는 또 다른 질문이다. – Beeelze

관련 문제