我的问题与“@tereško's”中Who should handle the conditions in complex queries, the data mapper or the service layer?答案的更新部分有关,下面是参考和方便的代码。
$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
的工厂对象,或者是否有其他选项我没有考虑过? 最佳答案
我不认为实际使用factory对象来添加文章。不过,您可能会看到自己使用一个来创建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()
中的方法。请注意,上面的示例非常简单,为了满足您的标准,需要修改代码。关于php - 通过数据映射器处理收集模式中的项目,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17145798/