代码之家  ›  专栏  ›  技术社区  ›  Julius F

模型与映射器关系

  •  1
  • Julius F  · 技术社区  · 15 年前

    我目前正在使用模型、映射器和控制器开发一个小应用程序。 我的问题是(因为我没有找到任何匹配的答案),当我们遇到以下情况时,映射器如何与模型(&控制器)交互。

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

    这将尽可能好地工作,模型有一个ID,映射器可以使用该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 没有明确的呼叫?

    问题是,我不想破坏映射器模式,因此模型不应该通过 $model->find() 但是我不希望有很多代码只是为了首先创建一个映射器,然后这样做等等。

    我希望你能理解我一点,我自己已经足够困惑了,因为我对许多模式和映射/建模技术都是新手。

    1 回复  |  直到 9 年前
        1
  •  1
  •   Gordon Haim Evgi    15 年前

    你可以添加一个 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();
        }
    }
    

    您的控制器不会直接访问用户模型和用户映射器,而是通过服务。