Laravel IOC绑定 - 关闭与自动解决

时间:2014-04-30 08:26:39

标签: php laravel inversion-of-control bind service-provider

我对Laravel的IOC绑定有疑问,特别是ServiceProviders,他们注册了Facade访问者。

遵循IOC

的官方文档
class FooServiceProvider extends ServiceProvider {

    public function register()
    {
        $this->app->bind('foo', function()
        {
            return new \MyApp\Foo;
        });
    }

}

以后你可以有一个Facade,它只会返回" foo" as" FacadeAccessor"。

像这样重写这段代码会不会更容易?

class FooServiceProvider extends ServiceProvider {

    public function register()
    {
        $this->app->bind('foo', '\MyApp\Foo');
    }

}

它提供了几乎相同的结果,因为字符串将自动包装到Closure中并通过App :: make()进行解析。更重要的是 - 如果需要,Foo构造函数可以有依赖注入(虽然你必须在第一种情况下传递精确的对象,并且根据我的理解,松散的自动解析)。

第二个选项看起来更清晰,除非在对象初始化之前需要一些额外的逻辑 - 比如传递数据,初始化其他服务/对象等 - 对我来说看起来更好。

可能存在与此相关的性能问题?或者我错过了其他什么?

有趣的事实 - 在文档中,对于Interfaces,Laravel建议使用第二个选项而不是Closure,但是对于ServiceProviders - 直接对象初始化。

1 个答案:

答案 0 :(得分:0)

第二种选择是最好的,闭包很大程度上用来提供一个很好的快速做事方式。

我个人避免闭包,除了路由,因为我希望IoC容器可以选择在需要时运行各种不同的依赖注入。