ドメインオブジェクトは他のデータマッパーを呼び出すことができますか?(Zend フレームワーク)

StackOverflow https://stackoverflow.com/questions/4227463

質問

例えば:

10 個のウィジェットを持つユーザーがいます。それに加えて、これらのウィジェットのうち 5 つを管理するマネージャーがあります。

指定したマネージャーが管理するユーザーのウィジェットを取得したいと考えています。そこで、WidgetMapper に fetchUsersManagingWidgets($userId, $managerId) という関数を作成しました。この関数は、これら 5 つのウィジェットのデータベースにクエリを実行し、Widget オブジェクトの配列をマップします。

ドメイン オブジェクトがそのマッパーを認識すべきではないことはわかっていますが、WidgetMapper の関数を呼び出す関数を User モデル内に作成できますか?

例えば

class Application_Model_User {

    public function getWidgetsManagedBy($manager) {
        $widgetMapper = new Application_Model_WidgetMapper;
        return $widgetMapper->fetchUsersManagedWidgets($this->getId(), $manager->getId());
    }

}

それとも、これは一方通行であり、ドメイン オブジェクトは決してマッパー関数を呼び出すべきではないのでしょうか?

役に立ちましたか?

解決

一般に、パターンとは、一般的な問題を解決する方法のアイデアです。彼らは「そうしなければならない」とか「それ以外はすべて悪い」というものではありません。実際には、 名前 意図的にパターンに従わない決定の場合。
私が見てきたことから、人々は「1 つの DB テーブルが 1 つのドメインであるため、すべての DB テーブルには 1 つのモデルと 1 つのマッパーが必要である」と考える傾向があります。あなたの場合、3つのテーブルがあると思います:ユーザー、ウィジェット、およびこれら 2 つの間の n:m 関係を保持するテーブル (これをユーザーウィジェットと呼びます)。
ユーザーウィジェットは実際にはユーザーモデルの一部であり、独自のモデル/マッパーを持たず、 ない ウィジェットモデルの一部。ユーザーモデル内のこれらのウィジェットIDを解決するには、もちろんウィジェットマッパーが必要ですが、これにより、あなたが説明した問題が発生します。
これを解決する方法はおそらくたくさんありますが、私は単純に上書き可能なデフォルトマッパーを想定しています。

Class UserModel
{
    $_widgetMapper = null;

    public function getWidgetMapper()
    {
        if(null === $this->_widgetMapper)
        {
             $this->setWidgetMapper(new DefaultWidgetMapper());
        }
        return $this->_widgetMapper();
    }

    public function setWidgetMapper($mapper)
    {
        // todo: make sure it's a mapper of the correct type
        $this->_widgetMapper = $mapper;
    }
}

デフォルトのウィジェットマッパーを使用したくない場合は、ユーザーのウィジェットにアクセスする前にそれを設定するだけです (ウィジェットはオンデマンドでロードされる必要があります)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top