在laravel的控制器的构造函数或laravel的控制器的具体功能中注入模型

时间:2018-12-19 13:24:56

标签: php laravel model-view-controller model controller

想象一下在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,因为在其他函数中需要它们吗?但是我不需要索引中的它们,因此每当我通过寻址索引特定的路由来调用索引时,都不会注入并创建它们。不好吗?那么哪个更好?

1 个答案:

答案 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:附带注释,要求最佳实践通常会吸引一些自以为是的答案,这将很难找到正确答案。