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

您可以添加一个服务层,例如

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 回答