Мой вопрос связан с секцией обновления ответа @ 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()
. Обратите внимание, что приведенные выше примеры чрезвычайно упрощены, и код должен быть адаптирован для соответствия вашим стандартам.