【问题标题】:Handling items in the collection pattern by a data mapper通过数据映射器处理集合模式中的项目
【发布时间】:2013-06-13 07:19:38
【问题描述】:

我的问题与“Who should handle the conditions in complex queries, the data mapper or the service layer?”中@tereško's答案的更新部分有关,下面是代码供参考和方便。

$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 是域对象的集合,我们称它们为Articles。在ArticleCollectionMapper 从数据库中获取数据并将其分配给$list 的那一刻,需要创建Article 的实例(对于每一行)。 Article 的实例是否会通过$list->addArticle($newArticle) 之类的方法添加到我们的集合实例($list)中,是否应该使用ArticleFactory 之类的工厂对象,或者还有其他我没有考虑过的选项?

【问题讨论】:

    标签: php design-patterns collections architecture datamapper


    【解决方案1】:

    我不认为实际使用工厂对象来添加文章。不过,您可能会看到自己使用一个来创建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 实例中获取条件来进行一些过滤,该实例已从上面的 sn-p 中排除。那么我们的域对象的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 中的内容。请注意,上述示例非常简化,代码需要进行调整以满足您的标准。

    【讨论】:

    • 嘿杰里米,谢谢你的回答。事实上,与此同时,我使用了类似的解决方案。而不是使用您展示的 addArticle,我在 ArticleCollection 中有一个 newArticle 和一个 addArticle 方法。第一个只返回一个文章对象,数据映射器通过自己的方法填充该对象。 addArticle 方法只是将给定的文章对象添加到列表中。所以你是对的,不需要工厂。
    猜你喜欢
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 2014-06-27
    • 1970-01-01
    • 2013-10-24
    • 2015-04-01
    相关资源
    最近更新 更多