如果来自不同控制器的视图使用相同的元素,需要不同的控制器将相同的数据(因此可能进行相同的处理)传递给视图,那么对单个控制器进行AJAX调用会不会更好? / p>
假设我们有这个:
用户属于某项服务,用户拥有多个帖子。
在Views/Services/view.ctp
中,我想显示特定服务的每个用户的列表,并为每个用户显示一些相关的信息以及他最近10个帖子的列表。
在Views/Users/view.ctp
中,我想显示用户的相关信息以及他的10个帖子的列表。
元素Views/Elements/list_users_post.ctp
允许我将代码显示为显示用户帖子的表格。它需要设置var $userPostList
,并且结构与$this->Post->find('all', array('conditions' => array('user_id' => $userId)))
的结果相同。
因此,在我的UsersController::view($userId)
和ServicesController::view($serviceId)
操作中,我最终会找到一些重复的代码来检索用户的帖子。
我想重构代码,以便操作ServicesController::view($serviceId)
不会在Post模型上进行任何查找,相反,视图Services/index.ctp
会对每个操作UsersController::view($userId)
进行AJAX调用用户。这样,不再有重复的代码,而是AJAX调用的开销。
有什么想法吗?
答案 0 :(得分:0)
避免重复代码的好方法是将其移动到模型层。所以在控制器中没有这个:
$this->Post->find('all', array('conditions' => array('user_id' => $userId)))
你可以在控制器中使用它:
$this->Post->getUserPosts($userId);
这是帖子模型:
function getUserPosts($userId){
return $this->find('all', array('conditions' => array('user_id' => $userId)));
}
AJAX调用也是一个很好的解决方案,但即使使用它们,最好在可能的情况下将业务逻辑保留在模型中。
避免重复代码的其他方法包括(但不限于): 在视图中使用助手 在控制器中使用组件 在模型中使用行为
这应该让你开始将你的代码保持干净。