2

例えば:

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

指定したマネージャーが管理しているユーザーのウィジェットを取得したいと考えています。そこで、WidgetMapper に fetchUsersManagedWidgets($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());
    }

}

それとも、これは一方通行であり、ドメイン オブジェクトはマッパー関数を呼び出すべきではありませんか?

4

1 に答える 1

1

一般に、パターンは、一般的な問題を解決する方法のアイデアです。彼らは「そうしなければならない」とか「他のすべてが悪い」というわけではありません。実際、意図的なパターンに従わない決定の名前さえあります。
私が見てきたことから、人々は「1 つの db テーブルは 1 つのドメインなので、すべての db テーブルには 1 つのモデルと 1 つのマッパーが必要だ」と考える傾向があります。あなたの場合、ユーザー、ウィジェット、およびこれら2つの間のn:m関係を保持するテーブル(ユーザーウィジェットと呼びます)の3つのテーブルがあるとします。
userwidgets は実際にはユーザー モデルの一部であり、独自のモデル/マッパーを持たず、ウィジェット モデルの一部ではありません。ユーザーモデルでこれらのウィジェット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;
    }
}

デフォルトの widget-mapper を使用したくない場合は、ユーザーのウィジェットにアクセスする前にそれを設定する必要があります (必要に応じてロードする必要があります)。

于 2010-11-19T17:31:08.533 に答える