就最佳实践而言,这是推荐的吗?我有一个需要在项目和配置文件控制器中调用的评论控制器 + 模型。评论控制器自动加载评论模型。
直接从项目和配置文件控制器调用评论控制器是否可以接受,或者是调用评论模型的“最佳实践”方式?
我问是因为在 kohana 中,视图不是单例类,所以如果我要在另一个控制器中调用控制器,我最终会得到两个视图。另一方面,如果我只是调用模型,项目和配置文件控制器中会有重复的代码。
所有 MVC 专家的帮助!=)
如果您使用 Kohana 3,则可以从 HMVC 功能中受益。您可以在控制器中执行控制器。
http://forum.kohanaphp.com/comments.php?DiscussionID=2768
检查上面的链接以获取一些示例
一般来说,我会选择“胖模型”的方法。
我不确定您真正担心复制哪些代码。
有几种方法可以做到这一点:
第一种方式: - 询问您的评论模型以返回一些评论。- 将评论数据传递到您的视图中。- 渲染视图中的评论,可能使用一些视图助手
第二种方式: - 意识到您的视图没有理由不能直接与您的模型对话。- 编写一个视图助手,直接从模型中获取它需要的数据,并渲染它。
我更喜欢第二种方式。有些人在让他们的视图层与模型对话时遇到问题(以只读方式!),但我不是其中之一。
我会说这取决于你的控制器返回什么。
如果您的控制器可以返回 DTO/模型,那么当然,调用控制器是一个好主意。
您的控制器为您的功能定义了一个严格的、记录在案且希望稳定的入口点。因此,您可以完全忽略 Comments 的实现,或者随意更改,只要不更改 Controller 方法的签名即可。
但是,如果您的控制器无法返回原始数据,那么它肯定是有问题的,因为您将获得 html(或其他标记)作为回报。这意味着您必须将该 html 直接通过管道传输到您想要的视图中,或者从中提取数据。这两个都是一个坏主意。
管道原始 html 意味着如果您更改 Comments 的视图,Profile 模块上的评论显示将不可避免地发生变化。这可能是你想要的,但我会追求灵活性。
现在,如果您想要数据,则必须从视图返回的标记中提取数据,这既繁重又适得其反。
如果您尝试调用静态方法,则可以直接调用该函数。例如:
class Controller_User extends Controller {
public static function format_user($user){
return array("data" => $user->getData());
}
}
class Controller_Foo extends Controller {
public function action_index(){
$user = get_user_data_some_how();
$user_data = Controller_User::format_user($user)
}
}