1

我有一个关于 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 - 直接对象初始化。

4

1 回答 1

0

第二个选项是最好的,闭包主要用于给出一个很好的快速示例来说明做某事的方式。

就我个人而言,我避免使用闭包,但路由除外,因为我希望 IoC 容器可以在需要时运行各种不同的依赖注入。

于 2014-04-30T12:27:15.437 回答