我只是想知道在某些情况下,决定在哪里创建操作/视图的最佳实践方法是什么。
如果用户有许多视频
哪里是创建动作/视图以显示用户视频的最佳位置?
因此,在用户帐户页面"我的视频"链接中,你是否
- 只需创建一个users/my_videos操作和视图
- 创建视频/my_videos动作和视图
- 或者很可能您已经拥有视频/索引的控制器/操作,该控制器/操作将具有搜索功能。只需在用户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随路由的变化而变化。