1

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

为简单起见,代码已更改。

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
    }
}

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

Laravel 版本:5.0.28

更新:从 WelcomeController 添加了代码示例。

4

2 回答 2

2

有了这个:

$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->make()你应该得到你在上面注册的同一个实例$this->app->singleton()

于 2015-04-29T15:09:57.453 回答
0

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

use App\Providers\MyBindingFacade as MyBinding;

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

于 2015-04-29T14:47:49.877 回答