Php Laravel、依赖注入和雄辩
将laravel的依赖项注入系统用于多实例对象(如CRUD模型)的正确/最佳方法是什么 PHP领域某些角落的当前流行说法是以下代码“不好” 这很糟糕,因为该方法现在依赖于新的对象实例化。当前的流行趋势是,对象应该通过某种依赖注入系统注入,比如Laravel的依赖注入系统 然而,注入雄辩的模型似乎有问题Php Laravel、依赖注入和雄辩,php,laravel,dependency-injection,Php,Laravel,Dependency Injection,将laravel的依赖项注入系统用于多实例对象(如CRUD模型)的正确/最佳方法是什么 PHP领域某些角落的当前流行说法是以下代码“不好” 这很糟糕,因为该方法现在依赖于新的对象实例化。当前的流行趋势是,对象应该通过某种依赖注入系统注入,比如Laravel的依赖注入系统 然而,注入雄辩的模型似乎有问题 /*...* public function __construct(\App\SomeModel $object) { $this->someModel = $object; }
/*...*
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的自动构造函数依赖项注入是否每次都创建新实例,或者注入的对象是否是单实例对象。它也不能处理您想要使用Elounce的静态助手的情况
function someMethod($object_id)
{
//another dependency
\App\SomeModel::find($object_id);
//but this doesn't work
$this->someModel->find($object_id);
}
在Laravel应用程序中是否有一种普遍接受的处理方法?有些人说你应该给工厂注射疫苗。另一些人说。我想知道Laravel开发人员的一般做法是什么,如果Laravel在这里提供了任何可以帮助的东西(基本工厂/存储库实现,等等)我对此做了一点尝试(没有认真的测试),看起来这是可能的-事实上,我更喜欢这样做,并期待未来。样本(未测试)如下:
像find这样雄辩的外观上的find助手很不错,但本质上他们是一个标准,在那里(…)->get()->first()。多亏了工程师的帮助,我自己解决了这个问题 事实证明,除了自动构造函数依赖项注入之外,Laravel还有一种特殊形式的依赖项注入,它可以与任何一种构造函数一起工作 考虑这个代码示例
Route::get('api/users/{user?}', function (App\User $user) {
return $user->email;
});
如果您使用变量(
{user}
)设置路由字符串,Laravel将扫描路由处理程序(上面是一个匿名函数,但它也与控制器方法一起工作)的参数,查找短类名与变量名匹配的类型提示(App\user
)。如果找到,Laravel将实例化一个已加载的雄辩对象,而不是从URL传递参数。如果使用可选参数,您将得到指定类型的空白对象。关于Laravel DI的广泛讨论非常棒。包括类和接口的使用等。我找到的最好的参考资料。
Laravel有一个强大的控制反转(IoC)/依赖注入(DI)容器。不幸的是,官方文档并没有涵盖所有可用的功能,所以我决定尝试使用它并为自己编写文档。以下是基于Laravel 5.4.26的-其他版本可能会有所不同。只是为了给脸起个名字,这就是路由绑定的意义所在,对吗?
use App/Models/Foo;
class FooController {
private $model;
public function __construct(Foo $model)
{
$this->model = $model;
}
public function show(Request $request, $id)
{
$foo = $this->model->where($this->model->getKeyName(), '=', $id)->first();
dd($foo);
}
public function store(Request $request)
{
$foo = $this->model->newInstance();
$foo->bar = $request->get('baz');
$foo->save();
}
}
Route::get('api/users/{user?}', function (App\User $user) {
return $user->email;
});