Обработка элементов в шаблоне сбора с помощью блока отображения данных

Мой вопрос связан с секцией обновления ответа @ tereško в разделе « Кто должен обрабатывать условия в сложных запросах, картотеке данных или уровне обслуживания? » Ниже приведен код для справки и удобства.

$category = new Category; $category->setTitle( 'privacy' ); $list = new ArticleCollection; $list->setCondition( $category ); $list->setDateRange( mktime( 0, 0, 0, 12, 9, 2001) ); // it would make sense, if unset second value for range of dates // would default to NOW() in mapper $mapper = new ArticleCollectionMapper; $mapper->fetch( $list ); foreach ( $list as $article ) { $article->setFlag( Article::STATUS_REMOVED ); } $mapper->store( $list ); 

В этом коде ArticleCollection представляет собой набор объектов домена, назовем их Article s. В тот момент, когда ArticleCollectionMapper извлекает данные из базы данных, присваивая ее $list , необходимо создать экземпляры Article (для каждой строки). Будут ли экземпляры Article добавлены в наш экземпляр коллекции ( $list ) с помощью метода типа $list->addArticle($newArticle) , если для этого должен использоваться заводской объект, например, ArticleFactory , или есть другой вариант, который я не рассматривал ?

Я бы не подумал, что на самом деле использовать объект фабрики для добавления статей. Вы можете увидеть, что используете его, чтобы сделать экземпляр Article (во втором примере). Я пошел дальше и сделал, добавив метод addArticles () в экземпляр ArticleCollection . Таким образом, вы можете просто вызвать метод на вашем экземпляре ArticleCollection из mapper. ArticleCollectionMapper может выглядеть примерно так:

 class ArticleCollectionMapper extends DataMapperAbstract { public function fetch ( ArticleCollection $articles ) { $prepare = $this->connection->prepare( "SELECT ..." ); $prepare->execute(); // filter conditions $articles->addArticles( $prepare->fetchAll() ); } } 

Вам нужно будет сделать некоторую фильтрацию, получив условия из экземпляра ArticleCollection , который исключен из вышеприведенного фрагмента. Тогда реализация addArticles() объекта addArticles() будет выглядеть следующим образом:

 class ArticleCollection extends DomainObjectAbstract { protected $collection = array(); public function addArticles ( Array $articles ) { foreach ( $articles as $article ) { $articleCollectionItem = new Article; $articleCollectionItem->setParams( $article ); // however you prefer filling your list with `Article` instances $this->collection[] = $articleCollectionItem; } } } 

Вы также можете добавить метод addArticle() зависимости от ваших потребностей, а затем просто заменить то, что находится в пределах foreach выше, с вызовом addArticle() . Обратите внимание, что приведенные выше примеры чрезвычайно упрощены, и код должен быть адаптирован для соответствия вашим стандартам.