【问题标题】:Laravel 5 Resolving dependencies in ServiceProviderLaravel 5 解决 ServiceProvider 中的依赖关系
【发布时间】:2015-07-08 22:21:48
【问题描述】:

我有一个类似于存储的类(添加/获取项目)。我尝试在一个服务提供者中将其绑定为单例,并在另一个服务提供者的引导方法中解决它。

为简单起见更改了代码。

app/Providers/BindingProvider.php

<?php namespace App\Providers;

use Illuminate\Support\Facades\Facade;
use Illuminate\Support\ServiceProvider as ServiceProvider;

class MyBindingFacade extends Facade {
    public static function getFacadeAccessor() {
        return 'my.binding';
    }
}

class MyBinding {

    protected $items = [];

    public function add($name, $item) {
        $this->items[$name] = $item;
    }
    public function get($name) {
        return $this->items[$name];
    }
    public function getAll() {
        return $this->items;
    }

}

class BindingProvider extends ServiceProvider {

    public function register() {
        $this->app->singleton('my.binding', function($app) {
            return $app->make('App\Providers\MyBinding');
        });
    }

    public function provides() {
        return [
            'my.binding',
        ];
    }
}

app/Providers/ResolvingProvider.php

<?php namespace App\Providers;

use Illuminate\Support\ServiceProvider as ServiceProvider;
use App\Providers\MyBinding;

class ResolvingProvider extends ServiceProvider {

    public function boot(MyBinding $binding) {
        $binding->add('foo', 'bar');

        // $manual = $this->app->make('my.binding');
        // $manual->add('foo', 'bar');
    }

    public function register() {}

}

app/Http/Controllers/WelcomeController.php

<?php
namespace App\Http\Controllers;

use App\Providers\MyBindingFacade;

class WelcomeController extends Controller {

    public function index()
    {
        dd(MyBindingFacade::getAll()); // debug items
    }
}

当我尝试在 WelcomeController 中调试 MyBinding 状态时,我得到了空的项目数组。但是,如果我从我的 ResolvingProvider 中取消注释 $manual 部分,它会返回一个包含 'foo' => 'bar' 的数组。这是否意味着 ServiceProvider::boot() 方法中的 IoC 分辨率被破坏了,还是我滥用了 Laravel 功能?

Laravel 版本:5.0.28

更新:添加了来自 WelcomeController 的代码示例。

【问题讨论】:

    标签: php dependencies laravel-5 ioc-container service-provider


    【解决方案1】:

    有了这个:

    $this->app->singleton('my.binding', function($app) {
        return $app->make('App\Providers\MyBinding');
    });
    

    您是说:my.binding 是一个单例,并解析为 App\Providers\MyBinding 的一个实例。

    这并不意味着App\Providers\MyBinding 也被注册为单例。你应该做的是:

    $this->app->singleton('App\Providers\MyBinding');
    
    $this->app->bind('my.binding', function($app) {
        return $app->make('App\Providers\MyBinding');
    });
    

    因为 Facade 绑定使用了$app-&gt;make(),所以您应该获得与上面$this-&gt;app-&gt;singleton() 注册的相同实例。

    【讨论】:

    • 好像我在向 IoC 寻求某种黑魔法。现在我懂了。谢谢你,卢卡斯!
    【解决方案2】:

    在第一个示例中,您没有使用 Facade,您应该使用:

    use App\Providers\MyBindingFacade as MyBinding;
    

    实际上会调用 make 它使用 'my.binding'。

    【讨论】:

    • 不应该MyBindingFacade 总是在my.binding 后面返回一个实例吗?您能否提供有关您的解决方案的更多信息?
    • 我还使用WelcomeController 的代码示例更新了我的问题,其中使用了MyBindingFacade
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-18
    • 1970-01-01
    • 2016-11-29
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多