gpt4 book ai didi

php - Laravel、依赖注入(inject)和 Eloquent

转载 作者:可可西里 更新时间:2023-10-31 23:27:51 25 4
gpt4 key购买 nike

将 laravel 的依赖注入(inject)系统与 CRUD 模型等多实例对象一起使用的正确/最佳方法是什么?

当前在 PHP 领域的某些角落流行说以下代码“不好”

function someMethod()
{
/* .. stuff ... */
$object = new \App\SomeModel;
$object->some_prop = 'some value';
$object->save();
/* .. other stuff ... */
}

这很糟糕,因为此方法现在依赖于新的对象实例化。当前的时尚认为应该通过某种依赖注入(inject)系统注入(inject)对象,例如 Laravel 的 automatic constructor dependency injection。 .

但是——注入(inject) Eloquent 模型似乎有问题

/*...*
public function __construct(\App\SomeModel $object)
{
$this->someModel = $object;
}

function someMethod()
{
/* .. stuff ... */
$object = $this->someModel;
$object->some_prop = 'some value';
$object->save();
/* .. other stuff ... */
}
/*...*/

不清楚Laravel 的自动构造函数依赖注入(inject)是每次都创建新的实例,还是注入(inject)的对象是单实例对象。它也不处理您想使用 Eloquent 的静态助手的情况

function someMethod($object_id)
{
//another dependency
\App\SomeModel::find($object_id);

//but this doesn't work
$this->someModel->find($object_id);
}

在 Laravel 应用程序中是否有一种普遍接受的方法来处理这个问题?有人说你应该注入(inject)工厂。其他人说存储库。我想知道 Laravel 开发人员的一般做法是什么 Laravel 是否附带了任何可以帮助解决这里问题的东西(基础工厂/存储库实现等)

最佳答案

感谢 LaraChat Slack 的一些帮助这是我自己想出来的。

事实证明,除了自动构造函数依赖注入(inject)之外,Laravel 还有一种特殊形式的依赖注入(inject),适用于任何 a router's callback methods/functions。 .

考虑这个代码示例

Route::get('api/users/{user?}', function (App\User $user) {
return $user->email;
});

如果您使用变量 ({user}) 设置您的路由字符串,Laravel 将扫描您的路由处理程序的参数(上面是一个匿名函数,但它也适用于 Controller 方法)参数短类名与变量名匹配的类型提示(上面的 App\User)。如果找到,Laravel 将实例化一个 loaded Eloquent 对象,而不是从 URL 传递参数。如果省略可选参数,您将获得指定类型的空白对象。

关于php - Laravel、依赖注入(inject)和 Eloquent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43689847/

25 4 0
文章推荐: eclipse - Eclipse : Logic, 中的 V8 调试器或有史以来最奇怪的错误?
文章推荐: javascript - 如何使用 jQuery 获取文本输入的所有值?
文章推荐: javascript - 我如何将 Node.js 与 Cappuccino 一起使用?
文章推荐: html - 在