想象一下在laravels构造函数(PostController)中需要注入3个模型的情况:用户,发布和注释。
我有两种情况:
1)将这3个模型全部注入控制器构造函数中,然后在类似这样的具体函数中使用此控制器变量:Illuminate/Database/QueryException with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'tasks.user_id' in 'where clause' (SQL: select * from `tasks` where `tasks`.`user_id` = 1 and `tasks`.`user_id` is not null)'
2)随时随地将这些模型注入具体控制器的功能中(例如$this->post
);
这两个中的哪一个是更好的做法?在第一种情况下,在索引函数中,我仅使用index(Post $post)
变量,但是我还创建了$this->post
和$this->comment
,因为在其他函数中需要它们吗?但是我不需要索引中的它们,因此每当我通过寻址索引特定的路由来调用索引时,都不会注入并创建它们。不好吗?那么哪个更好?
答案 0 :(得分:3)
通常,当在控制器方法中注入模型时,这意味着您正在尝试将路线值绑定到模型。简而言之,您希望laravel自动神奇地为您获取该模型。
另一方面,当您通过__construct()
进行注入时,您希望实例化这些模型以供在类中使用。简单来说,您希望Laravel在类中创建该模型的新实例。
我们开始实践吧:
第一种情况
//routes
Route::get('/ninjas/{ninja}') //ninja is a number or anything that identifies a model
//Controller
public function index(Ninja $ninja)
{
//$ninja will be a resolved model
}
其他情况
public function __construct(Ninja $ninja)
{
$this->ninja = $ninja;
}
public function index($ninja_id)
{
$this->ninja->find($ninja_id)
}
从以上示例中可以看到,这取决于用例。也就是说,如果您打算将模型绑定到路由,则将注入控制器方法,否则,如果要以 cleaner 的方式使用模型,直到构造函数即可。
干杯!
PS:附带注释,要求最佳实践通常会吸引一些自以为是的答案,这将很难找到正确答案。