Laravel、依赖注入和 Eloquent

Ala*_*orm 5 php dependency-injection laravel

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

PHP 领域的一些流行人士认为以下代码是“糟糕的”

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

这很糟糕,因为这个方法现在依赖于新的对象实例化。当前的时尚认为对象应该通过某种依赖注入系统来注入,比如 Laravel 的自动构造函数依赖注入

然而——注入雄辩的模型似乎有问题

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

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

目前尚不清楚 Laravel 的自动构造函数依赖注入是否每次都会创建新实例,或者注入的对象是否是单实例对象。它也不能处理您想要使用 Eloquent 的静态助手的情况

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

    //but this doesn't work
    $this->someModel->find($object_id);
}    
Run Code Online (Sandbox Code Playgroud)

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

Ala*_*orm 1

感谢LaraChat Slack的帮助,我自己解决了这个问题。

事实证明,除了自动构造函数依赖注入之外,Laravel 还有一种特殊形式的依赖注入,可以与任何路由器的回调方法/函数一起使用。

考虑这个代码示例

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

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