3

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

如果用户有很多视频

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

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

  1. 只需创建一个users/my_videos操作并查看。
  2. 创建视频/my_videos动作和视图。
  3. 或者您很可能已经拥有一个具有搜索功能的视频/索引控制器/操作。只需使用这个传入用户 ID。

非常感谢任何想法/建议

谢谢

狮子座

4

5 回答 5

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 的爱(这是我见过的最好的链接 - db 层不需要 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

于 2011-05-24T23:19:47.003 回答
0

我喜欢把事情分开。

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

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

}
于 2011-05-20T14:51:48.443 回答
0

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

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

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

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

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

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

于 2011-05-20T10:19:54.363 回答
0

我的看法是,这取决于您分配给控制器的责任。

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

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

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

通常,当某些事情感觉不对时,它就是不对的。尝试拆分它,看看它是如何工作的。您也可以稍后重新安排/重构。

只是一个想法。

于 2011-05-24T08:27:43.167 回答
0

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

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

我不会做的一件事是让您想要的 URL 确定您将功能放在哪个控制器中。URL 会随着路由发生细微的变化。

于 2011-05-24T09:52:06.187 回答