Model view controller MVC在最合适的控制器中执行操作

Model view controller MVC在最合适的控制器中执行操作,model-view-controller,cakephp,frameworks,code-structure,Model View Controller,Cakephp,Frameworks,Code Structure,我只是想知道在某些情况下,决定在何处创建操作/视图的最佳实践方法是什么 如果用户有许多视频 哪里是创建操作/视图以显示用户视频的最佳位置 那么,在用户帐户页面的“我的视频”链接中,你认为呢 只需创建一个用户/my_视频操作和视图 创建视频/my_视频操作和查看 或者,最有可能的情况是,您已经有了一个具有搜索功能的视频/索引的控制器/操作。只需使用此方法传入用户id 非常感谢您的任何想法/建议 谢谢 Leo与代码一样,您有两个极端: 1) 将所有内容放在一个控制器中 2) 每个动作都在一个单独的控

我只是想知道在某些情况下,决定在何处创建操作/视图的最佳实践方法是什么

如果用户有许多视频

哪里是创建操作/视图以显示用户视频的最佳位置

那么,在用户帐户页面的“我的视频”链接中,你认为呢

  • 只需创建一个用户/my_视频操作和视图
  • 创建视频/my_视频操作和查看
  • 或者,最有可能的情况是,您已经有了一个具有搜索功能的视频/索引的控制器/操作。只需使用此方法传入用户id
  • 非常感谢您的任何想法/建议

    谢谢


    Leo

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

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

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

    理想的方法几乎总是在两者之间的某个地方,那么如何决定什么是组合在一起的,什么是分开的呢

    在MVC中,我倾向于查看视图,看看它们的共同点是什么:正如您指出的,用户在模型中有一个对视频集合的引用,但是您是否希望在任何单个视图中同时使用这两组数据?i、 e.在本例中,您是否可能在一个既管理用户详细信息又显示视频列表的页面上?如果不是的话,我建议使用单独的控制器


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

    我喜欢将事情分开

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

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

    我的看法是,这取决于你分配给控制员的责任

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

    你可能想考虑一些像UserDashboard(或类似但适当命名)的东西,如邓哈兹在评论中所暗示的那样。从“入口”的角度来看,这可能会损害所有功能。与横幅/快捷方式/操作菜单的工作方式相同

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

    通常情况下,当某件事情感觉不对劲时,它就不对劲了。试着把它分开,看看它是如何工作的。您也可以稍后重新安排/重构


    只是一个想法。

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

    在您的示例中,我会说您的主要对象是一个视频,您需要的操作是一个由特定属性过滤的视频列表(在本例中是用户id,但这很可能是一个类别、一个位置等)


    有一件事我不会让你想要的URL决定你把你的功能放在哪个控制器上。URL随路由的变化很小。

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

    <?php
        ...
        echo $this->Html->link( 'User\'s Videos', array(
            'controller' => 'videos',
            'action' => 'index',
            'prefix' => 'user',
            $this->Session->read( 'Auth.User.id' )
        ));
    ?>
    
    由于视频周围的代码可能比简单的“哪个用户有哪些视频”查找要多得多,因此视频列表操作应该在VideosController中

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

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

    <?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 love(这是我见过的最好的链接-db层上不需要Slug字段-)

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

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


    我的处境与此完全相同,我的一部分人希望将其放入用户控制器,但这与编辑用户无关,尽管我希望它出现在用户的“仪表板”中。请参阅我的答案dunhamzzz-一旦操作起作用,您可以通过仪表板的requestAction将其拉入。这是requestAction最常见的用途之一—您可以让evn通过调用使用requestAction调用的元素中的预设分页参数来缓存和获取自己的数据。我不建议将所有内容都放在一个控制器中,因为您违反了单一责任原则==>一个类改变的原因不应该超过一个。好吧,您可能只有两个操作执行非常相似的任务!但请注意,我确实指出,这是两个“可能”的极端,理想几乎总是介于两者之间。我不主张任何一种“极端”的解决方案!这看起来是目前为止最好的方式,但我担心用户前缀会与我的其他用户操作冲突?users/login、users/regitser等必须确保在指向用户控制器的链接中使用“prefix”=>false或“user”=>false,这些链接没有前缀