通过数据映射器处理集合模式中的项目
我的问题与@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
。 ArticleCollectionMapper
从数据库中提取数据并将其分配给$list
的那一刻,需要为每个行创建Article
实例。 会的情况下, Article
被添加到我们收集实例( $list
通过类似的方法) $list->addArticle($newArticle)
应该像一个工厂对象ArticleFactory
用于该,或者是有其他的选择我还没有考虑?
我不认为实际使用工厂对象来添加文章。 不过,您可能会看到自己使用一个来创建Article
(在第二个示例中)的实例。 我说干就干,做的是增加一个addArticles ()
方法将ArticleCollection
实例。 这样,您可以简单地从映射器调用您的ArticleCollection
实例的方法。 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()
实现看起来类似如下:
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()
方法,然后使用addArticle()
的调用替换上面的foreach
。 请注意,上述示例非常简单,需要对代码进行调整以符合您的标准。
上一篇: Handling items in the collection pattern by a data mapper