1

私は現在、モデル、マッパー、コントローラーを使用した小さなアプリケーションに取り組んでいます。私の質問は、(一致する答えが見つからなかったため)、次のような状況で、マッパーがモデル(およびコントローラー)とどのように相互作用するかです。

$user = new UserModel();
$user->setId('21');
$userMapper = new UserMapper($user);
$userMapper->retrieve();

これは可能な限りうまく機能します。モデルには、マッパーが必要なユーザーを取得できる(そして、ユーザーオブジェクトにマップし直す)ためのIDがあります。

私の問題は、このコードをどのようにラップできるかということです。つまり、このコードは非常に生であり、コントローラーで使用することは絶対にお勧めできません。短くしたいのですが、正確にはわかりません。

public function view($id)
{
     $user->find($id); // this seems always to be tied with the user object/model (e.g. cakephp), but I think the ->find operation is done by the mapper and has absolutly nothing to do with the model
     $view->assign('user',$user);
}

次のようになります。

public function view($id)
{
    $mapper = $registry->getMapper('user');
    $user = $mapper->find($id);
    // or a custom UserMapper method:
    # $user = $mapper->findById($id);
    $view->assign('user',$user);
}

しかし、これははるかに多くのコードです。プロシージャを親コントローラークラスに含めて、明示的に呼び出さなくgetMapperても簡単にアクセスできるようにする必要がありますか?$this->_mapper

問題は、マッパーパターンを壊したくないので、モデルがSQL / Mapperメソッドに直接アクセスするべきでは$model->find()ないということですが、最初にマッパーを作成してこれを実行するためだけに多くのコードを用意する必要はありません。これなど。

私は多くのパターンやマッピング/モデリング手法に慣れていないので、私を少し理解していただければ幸いです。私自身はすでに十分に混乱しています。

4

1 に答える 1

1

たとえば、 Service Layerを追加できます

class UserService
{
    public function findUserById($id)
    {
        // copied and adjusted from question text
        $user = new UserModel();
        $user->setId($id);
        $userMapper = new UserMapper($mapper);
        return $userMapper->retrieve();
    }
}

コントローラーは UserModel と UserMapper に直接アクセスするのではなく、サービスを介してアクセスします。

于 2009-12-30T12:49:40.533 に答える