3

私の質問は、「複雑なクエリ、データマッパー、またはサービスレイヤーの条件を処理する必要があるのは誰ですか? 」の@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はドメイン オブジェクトのコレクションです。それらをArticles と呼びましょう。ArticleCollectionMapperがデータベースからデータをフェッチし、それを に割り当てた瞬間に$list、 のインスタンスをArticle(行ごとに) 作成する必要があります。のインスタンスは、 のようなメソッドを介してArticleコレクション インスタンス ( ) に追加されますか? そのためにファクトリ オブジェクトを使用する必要がありますか? それとも、私が考慮していない別のオプションがありますか?$list$list->addArticle($newArticle)ArticleFactory

4

1 に答える 1

2

ファクトリオブジェクトを実際に使用して記事を追加することは考えていません。ただし、(2 番目の例で)のインスタンスを作成するために 1 つを使用していることに気付くかもしれませArticleん。私が先に行ったのは、インスタンスaddArticles ()にメソッドを追加することでした。このようにして、マッパーから のArticleCollectionインスタンスのメソッドを簡単に呼び出すことができます。次のようになります。ArticleCollectionArticleCollectionMapper

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()。上記の例は非常に単純化されており、標準に合わせてコードを変更する必要があることに注意してください。

于 2013-08-08T03:37:10.103 に答える