2009-12-30 250 views
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

问题是,我不想破坏映射器模式,所以模型不应该直接通过$model->find()来访问任何SQL /映射器方法,但我不想有很多代码只是为了首先创建一个映射器和做到这一点,这等

我希望你能够理解我一点点,我自己已经够糊涂,因为我是新来的许多模式和绘图/建模技术。

+1

马上跟随模式是没有意义的;)只要做一些对你来说很方便的事情。模式应该为你节省时间并帮助你找出解决问题的方法,但它们不是你必须遵循的宗教。 – openfrog 2010-01-04 18:19:54

回答

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,而是通过服务。

+0

谢谢;)但我仍然需要在我的控制器中调用Service类。 – 2009-12-30 12:54:15

+1

我不确定我明白你的问题是什么?您是否在寻找依赖注入,例如http://components.symfony-project.org/dependency-injection/ – Gordon 2009-12-30 12:59:59

+0

是啊帮我也非常感谢你;) – 2009-12-30 13:15:11