MVC将动作放在最合适的正确控制器中

时间:2011-05-20 10:11:18

标签: model-view-controller cakephp frameworks code-structure

我只是想知道在某些情况下决定在哪里创建动作/视图的最佳实践方法。

如果用户 hasMany 视频

创建动作/视图以显示用户视频的最佳位置在哪里?

因此,在“用户”帐户页面中,“我的视频”链接是

  1. 只需创建 users / my_videos 操作并查看。
  2. 制作视频/ my_videos 操作和视图。
  3. 或者您很可能已经拥有视频/索引的控制器/动作,它具有搜索功能。只需在用户ID中使用此传递即可。
  4. 任何想法/建议都非常感谢

    由于

    利奥

5 个答案:

答案 0 :(得分:3)

一个可能的选择是执行以下操作:

由于视频可能包含更多代码,而不是简单的哪个用户查看视频列表操作应该在VideosController中。

在过去的项目中,我(使用CakePHP 1.3)使用前缀路由来解决其中一些问题。

在config / core.php中,请确保启用routing.prefixes以包含“用户”前缀。

<?php
    ... in routes.php ...
    Routing.prefixes = array( 'user' );
?>

在视频控制器中,使用以下签名进行操作:

<?php
    ...
    public function user_index( $userID = null ){
        ...
    }
?>

并且在您链接到用户视频列表的视图中,html :: link调用应类似于以下内容:

<?php
    ...
    echo $this->Html->link( 'User\'s Videos', array(
        'controller' => 'videos',
        'action' => 'index',
        'prefix' => 'user',
        $this->Session->read( 'Auth.User.id' )
    ));
?>

当然,这假设您在此处使用Auth组件来跟踪登录用户。用于读取经过身份验证的用户ID的会话帮助程序代码可能需要调整。

这可以让你a)除了启用前缀路由之外不要太担心路由而且b)会很快让你拥有像这样的漂亮链接 - site.com/user/videos/index/419

将此与一些Slug爱结合起来(这是我见过的最好的链接 - 数据库层上不需要slug字段 - http://42pixels.com/blog/slugs-ugly-bugs-pretty-urls

你甚至可以很容易地得到这样的网址: site.com/user/videos/index/eben-roux

只需对app / config / routes.php进行一点点编辑即可消除/ index /部分,结果将是SEO友好且用户友好的格式: 的 site.com/user/videos/eben-roux

http://book.cakephp.org/view/945/Routes-Configuration

答案 1 :(得分:0)

与代码一样,您有两个极端:

1)将所有内容放在一个控制器中

2)将每个动作都放在一个单独的控制器中

理想的方法几乎总是介于两者之间,以便如何确定哪些组合在一起以及分离的是什么?

在MVC中,我倾向于查看视图,看看共性是什么:正如您所指出的,用户在模型中有一组视频的参考,但您想在任何一个视图中使用这两组数据吗?即,在此示例中,您可能会在一个既管理用户详细信息又显示视频列表的页面上?如果没有,那么我会建议单独的控制器。

如果任何一个控制器都非常简单 - 例如一种方法,然后可能值得考虑合并两者。

答案 2 :(得分:0)

我喜欢把事情分开。

我要做的是在视频控制器中进行索引操作,将用户的id作为参数传递,然后仅显示当前用户的视频。

public function index($id = null){
   $this->paginate = array( 'conditions'=> array('Video.user_id' => $id));
   $this->set('videos', $this->paginate());

}

答案 3 :(得分:0)

我认为这取决于您分配给控制器的责任。

我想说像用户或视频控制器这样的东西应该只关注那些实体。

您可能需要考虑Dunhamzzz在评论中提到的类似UserDashboard(或类似但适当命名的内容)的内容。这可以从“入口”的角度来概括所有功能。横幅/快捷方式/操作菜单的工作方式相同。

您的UserDashboard将使用获取相关数据所需的任何数据层/存储库(例如IVideoRepository或IVideoQuery实现)。

通常当某些事情感觉不对时,事实并非如此。尝试拆分它,看看它是如何工作的。你可以在以后再次重新安排/重构。

只是一个想法。

答案 4 :(得分:0)

我不认为这个问题有一个“一刀切”的解决方案,但我会尝试采用一种方法来确定你正在处理的主要对象是什么,以及将动作/视图添加到该对象的控制器。

在你的例子中,我会说你的主要对象是一个视频,你需要的动作是一个由特定属性过滤的视频列表(在这种情况下是用户的id,但这很可能是一个类别,地点等。)。

我不会做的一件事是让你想要的URL确定你在哪个控制器中放置你的功能。通过路由轻松更改URL。