首页 > 解决方案 > 在 laravel 控制器的构造函数或 laravel 控制器的具体函数中注入模型

问题描述

想象一下在 laravel 构造函数(PostController)中我需要注入 3 个模型的情况:用户、帖子和评论。

我有两种情况:

1)在控制器构造函数中注入这3个模型,然后我在具体函数中使用这个控制器变量,如下所示:$this->post

2)随时随地将这些模型注入具体控制器的功能中(例如index(Post $post));

这两个哪个是更好的做法?在第一种情况下,在索引函数中我只使用$this->post变量,但我也创建$this->comment并且$this->user因为我在其他函数中需要它们?但我不需要它们在索引中,所以每当我通过寻址索引特定路由调用索引时,我都会注入和创建它们。那不是很糟糕吗?那么这些哪个更好?

标签: phplaravelmodel-view-controllermodelcontroller

解决方案


通常,当您在控制器方法中注入模型时,这意味着您正在尝试将路由值绑定到模型。简单来说,您希望 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:附带说明,要求最佳实践通常会吸引固执己见的答案,这会使找到正确答案变得困难。


推荐阅读