php - 在 laravel 控制器的构造函数或 laravel 控制器的具体函数中注入模型
问题描述
想象一下在 laravel 构造函数(PostController)中我需要注入 3 个模型的情况:用户、帖子和评论。
我有两种情况:
1)在控制器构造函数中注入这3个模型,然后我在具体函数中使用这个控制器变量,如下所示:$this->post
2)随时随地将这些模型注入具体控制器的功能中(例如index(Post $post)
);
这两个哪个是更好的做法?在第一种情况下,在索引函数中我只使用$this->post
变量,但我也创建$this->comment
并且$this->user
因为我在其他函数中需要它们?但我不需要它们在索引中,所以每当我通过寻址索引特定路由调用索引时,我都会注入和创建它们。那不是很糟糕吗?那么这些哪个更好?
解决方案
通常,当您在控制器方法中注入模型时,这意味着您正在尝试将路由值绑定到模型。简单来说,您希望 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)
}
从上面的例子可以看出,这取决于用例。也就是说,如果您打算将模型绑定到路由,则注入控制器方法,否则如果您想以更清洁的方式使用模型,则直到构造函数。
干杯!
PS:附带说明,要求最佳实践通常会吸引固执己见的答案,这会使找到正确答案变得困难。