我的问题与更新部分有关@特雷斯科的回答于“谁应该处理复杂查询中的条件,数据映射器还是服务层?" 下面是代码供参考和方便。
$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()
方法取决于您的需要,然后只需替换其中的内容foreach
上面调用了addArticle()
。请注意,上面的示例非常简化并且代码will需要进行调整才能满足您的标准。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)