【问题标题】:CakePHP - Render views using elements vs ajaxCakePHP - 使用元素与 ajax 渲染视图
【发布时间】:2014-10-28 09:52:52
【问题描述】:

如果来自不同控制器的视图使用相同的元素,需要不同的控制器将相同的数据(因此可能进行相同的处理)传递给视图,那么对单个控制器进行 AJAX 调用不是更好吗?

假设我们有这个:

  • 模型/Post.php
  • 型号/User.php
  • 模型/Service.php
  • 控制器/UsersController.php
  • 控制器/ServicesController.php
  • 视图/用户/view.ctp
  • 视图/服务/view.ctp
  • 视图/元素/list_users_post.ctp

一个用户属于一个服务,一个用户有很多帖子。 在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 调用的开销。

有什么想法吗?

【问题讨论】:

    标签: ajax cakephp view controller element


    【解决方案1】:

    在您的案例中避免重复代码的一个好方法是将其移至模型层。所以不要在控制器中使用这个:

    $this->Post->find('all', array('conditions' => array('user_id' => $userId)))
    

    你会在控制器中有这个:

    $this->Post->getUserPosts($userId);
    

    这在 Post 模型中:

    function getUserPosts($userId){
        return $this->find('all', array('conditions' => array('user_id' => $userId)));
    }
    

    AJAX 调用也是一个很好的解决方案,但即使使用它们,如果可能,最好将业务逻辑保留在模型中。

    其他避免重复代码的方法包括(但不限于): 在视图中使用助手 在控制器中使用组件 在模型中使用行为

    这应该让您开始保持代码干燥。

    【讨论】:

    • 是的,对于一些棘手的查找已经完成了,例如需要请求多个模型。但这不会阻止在多个控制器中放置相同(尽可能小)的代码。使用元素的其他缺点之一是变量转发......当您有嵌套元素时,必须为顶级 ont 提供子元素所需的所有变量,从而严重耦合元素。我只看到 AJAX 来防止这种情况,但是,嗯,我想知道开销......
    猜你喜欢
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 1970-01-01
    • 2019-11-18
    • 1970-01-01
    • 2011-11-17
    • 1970-01-01
    相关资源
    最近更新 更多