我想举个例子来简化问题: 如果您正在实施Facebook,您希望将用户信息与帐户信息,帖子,来自之间分开,这意味着将有用户模型,用户信息模型,帖子模型,for for模型。
现在如果你转到用户配置文件,它会加载来自所有这些模型的信息,问题是如何构建控制器,当然你需要每个模型的控制器来定义它的独特动作,但是我如何处理渲染? 我是否制作了一个能够处理所有渲染的新控制器?或者我只是将渲染配置文件放在用户控制器中 - 这意味着它可以访问其他模型 - 或者我在每个控制器中放置它自己的渲染,然后将它们组合在一起...... 或者如果你有更好的方法?
我只是不知道我想到的每种方法的后果,我不知道是否有一种我没有想到的更好的方法。
答案 0 :(得分:1)
当然,每个模型都需要控制器来定义它的独特动作
不,这是错误的。
控制器是您的表示层的一部分,有些人可能会说您需要为每个视图对象设置一个控制器,但是对于模型层,它与您拥有的控制器数量无关
一个View是一个切换多个模板的对象,再一次这与你的控制器无关,渲染是一个视图责任。 要了解更多信息,请查看here,here和here
这些是非常有用的信息。
答案 1 :(得分:1)
正如其他人所提到的,您不需要专门针对每个型号的控制器。但是,根据您的Facebook示例,it's quite simply done through relationships。
过度简化将是:
用于保存用户帐户信息和关系的用户模型
class User extends Eloquent {
public function posts() {
return $this->hasMany('posts', 'from_user_id');
}
}
用于保存内容和从/到关系到用户
的帖子模型class Post extends Eloquent {
public function from() {
return $this->belongsTo('user', 'from_user_id');
}
public function to() {
return $this->belongsTo('user', 'to_user_id');
}
}
那么也许你会让UserController加载一个这样的视图:
class UserController extends BaseController {
public function index($id) {
$user = User::find($id);
return View::make('user_page', array(
'user' => $user,
'posts' => $user->posts()->with('to')->get()
));
}
}
答案 2 :(得分:0)
错误答案 - 控制器不是表示层的一部分 - 它们是传输层的一部分。他们的任务是对HTTP请求做出反应。 请求由路由器分派。要证明一下Laravel的来源。控制器是路由包的一部分。当你打电话给例如:
Route::get("/","HomeController");
您只是在 RouteCollection 中注册请求参数。但一切都发生在路由器中。控制器可以在没有任何视图层的情况下存在。