Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过数据映射器处理集合模式中的项_Php_Design Patterns_Collections_Architecture_Datamapper - Fatal编程技术网

Php 通过数据映射器处理集合模式中的项

Php 通过数据映射器处理集合模式中的项,php,design-patterns,collections,architecture,datamapper,Php,Design Patterns,Collections,Architecture,Datamapper,我的问题是有关更新部分的回答,下面是“”的代码,以供参考和方便 $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 u

我的问题是有关更新部分的回答,下面是“”的代码,以供参考和方便

$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 );

在这个代码中,
articlecolection
是域对象的集合,我们称它们为
Article
s。
ArticleCollectionMapper
从数据库中获取数据并将其分配给
$list
时,需要创建
Article
的实例(针对每一行)。
Article
的实例是否会通过
$list->addArticle($newArticle)
这样的方法添加到我们的集合实例(
$list
),如果使用
ArticleFactory
这样的工厂对象,或者还有其他我没有考虑的选项吗?

我不认为实际使用factory对象来添加文章。不过,您可能会看到自己使用一个来创建
文章的实例(在第二个示例中)。我所做的是将
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
中的内容。请注意,上面的示例非常简单,需要对代码进行调整以满足您的标准。

嘿,jeremy,谢谢您的回答。事实上,与此同时,我使用了类似的解决方案。我没有使用您展示的addArticle,而是在Article集合中有一个newArticle和一个addArticle方法。第一个只返回一个article对象,datamapper通过自己的方法填充该对象。addArticle方法只是将给定的article对象添加到列表中。所以你是对的,一个不需要工厂。