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



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

如果用户有许多视频

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

因此,在用户帐户页面"我的视频"链接中,你是否

  1. 只需创建一个users/my_videos操作和视图
  2. 创建视频/my_videos动作和视图
  3. 或者很可能您已经拥有视频/索引的控制器/操作,该控制器/操作将具有搜索功能。只需在用户id中使用此传递

非常感谢您的任何想法/建议

感谢

Leo

一个潜在的选择是执行以下操作:

由于视频可能有比简单的哪个用户有哪个视频查找更多的代码,因此视频列表操作应该在VideosController中。

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

在config/core.php中,请确保启用routing.prefix以包含"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

再加上一些鼻涕虫的爱(这是我见过的最好的链接-数据库层上不需要鼻涕虫字段-http://42pixels.com/blog/slugs-ugly-bugs-pretty-urls(

你甚至可以很容易地得到这样的URL: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( 将所有内容放入单个控制器

2( 在单独的控制器中执行每个操作

理想的方法几乎总是介于两者之间,那么如何决定什么被分组在一起,什么被分离?

在MVC中,我倾向于查看视图,看看它们的共性是什么:正如你所指出的,用户在模型中有一个视频集合的引用,但你希望在任何一个视图中都有这两组数据吗?即,在这个例子中,你是否可能在一个既管理用户详细信息又显示视频列表的页面上?如果没有,我建议单独的控制器。

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

我喜欢把事情分开。

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

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

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

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

您可能需要考虑像Dunhamzzz在评论中提到的UserDashboard(或类似但命名适当的东西(。这可以从"入口"的角度标记所有功能。与横幅/快捷方式/操作菜单的工作方式相同。

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

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

只是一个想法。

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

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

我不会做的一件事是让你想要的URL决定你把你的功能放在哪个控制器里。URL随路由的变化而变化。

相关内容

  • 没有找到相关文章

最新更新