【问题标题】:Inject models in laravel's controllers's constructors or laravel's controller's concrete function在 laravel 控制器的构造函数或 laravel 控制器的具体函数中注入模型
【发布时间】:2023-04-09 07:53:01
【问题描述】:

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

我有两种情况:

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

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

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

【问题讨论】:

  • 你不能注入模型。你为什么要那个?您的问题可能有更好的解决方案
  • 因为我不想写 $user = new User();那么我将无法在测试时模拟这个 $user 变量
  • 我也可以注入模型

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


【解决方案1】:

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

【讨论】:

  • “您正在尝试将路由值绑定到模型”是什么意思
  • @O.Shekriladze 我在第一句话中解释了:In a simple term, you want laravel to auto-magically fetch that model for you. 这意味着我在第一种情况下展示的内容,您将 id 传递到路由中,例如 ninjas/1 和您的控制器中Laravel 方法为您获取该模型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-09
相关资源
最近更新 更多