我有一个关于 Laravel 的 IOC 绑定的问题,尤其是注册 Facade 访问器的 ServiceProviders。
class FooServiceProvider extends ServiceProvider {
public function register()
{
$this->app->bind('foo', function()
{
return new \MyApp\Foo;
});
}
}
稍后你可以有一个 Facade,它只返回“foo”作为“FacadeAccessor”。
像这样重写这段代码不是更容易吗?
class FooServiceProvider extends ServiceProvider {
public function register()
{
$this->app->bind('foo', '\MyApp\Foo');
}
}
它给出了几乎相同的结果,因为字符串将自动包装到 Closure 中并通过 App::make() 解析。不仅如此 - 如果需要, Foo 构造函数可以进行依赖注入(据我所知,在第一种情况下您必须传递确切的对象,并且松散的自动解析)。
第二个选项看起来更干净,除非您在对象初始化之前需要一些额外的逻辑 - 比如传递数据,初始化其他服务/对象等 - 对我来说看起来更好。
也许有与此相关的性能问题?还是我错过了其他东西?
有趣的事实 - 在文档中,对于接口,Laravel 建议第二个选项而不是闭包,但对于 ServiceProviders - 直接对象初始化。