Как я могу создать успешную фабрику объектов домена в PHP

Я возился с инфраструктурой MVC, и я наткнулся на проблему, я не уверен, как ее решить.

Я хочу создать DomainObjectFactory для слоя Model моего приложения, однако каждый объект Domain будет иметь другой набор аргументов, например:

  • Person – $ id, $ name, $ age.
  • Post – $ id, $ author, $ title, $ content, $ comments
  • Комментарий – $ id, $ author, $ content

И так далее. Как я могу легко сказать своей фабрике, какие объекты мне нужны?

Я придумал несколько вариантов:

  • Передайте массив – мне это не нравится, потому что вы не можете полагаться на контракт конструктора, чтобы рассказать, что нужно для его работы.
  • Сделайте DomainObjectFactory интерфейсом и создайте конкретные классы – Проблемный, потому что это очень много заводов!
  • Использовать Reflection – Service locator? Я не знаю, мне кажется, что это так.

Есть ли полезная схема соизволения, которую я могу использовать здесь? Или какое-то другое умное решение?

Почему вы хотите инициализировать объект домена со всеми назначенными свойствами?

Вместо этого просто создайте пустой объект домена . Вы можете на заводской проверке, если у него есть метод prepare() для выполнения. Ох .. и если вы используете DAO , вместо прямого взаимодействия с Mappers , вы можете захотеть построить и ввести соответствующий DAO в свой объект домена .

Назначение значений должно происходить только в Сервисе . С помощью обычных сеттеров.

Некоторые примеры:

Получение существующей статьи

 public function retrieveArticle( $id ) { $mapper = $this->mapperFactory->create('Article'); $article = $this->domainFactory->create('Article'); $article->setId( $id ); $mapper->fetch( $article ); $this->currentArticle = $article; } 

Новый комментарий

 public function addComment( $id, $content ) { $mapper = $this->mapperFactory->create('article'); $article = $this->domainFactory->create('Article'); $comment = $this->domainFactory->create('Comment'); $comment->setContent( $content ); $comment->setAuthor( /* user object that you retrieved from Recognition service */ ); $article->setId( $id ); $article->addComment( $comment ); // or you might retrieve the ID of currently view article // and assign it .. depends how you build it all $mapper->store( $article ); // or } 

Передача пользовательского ввода

 public function getArticle( $request ) { $library = $this->serviceFactory->build('Library'); $library->retrieveArticle( $request->getParameter('articleId')); }