Laravel 5 Разрешение зависимостей в ServiceProvider

У меня есть класс, который действует как хранилище (добавить / получить элемент). Я пытаюсь связать его как синглтон в одном поставщике услуг и разрешить его в другом способе загрузки.

Код изменен для простоты.

приложение / Провайдеры / 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',
];
}
}

приложение / Провайдеры / 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() {}

}

приложение / Http / Контроллеры / 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.

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');
});

Поскольку привязка Фасад использует $app->make() вы должны получить тот же экземпляр, который вы зарегистрировали в $this->app->singleton() прямо над.

2

Другие решения

В первом примере вы не используете Фасад, вы должны использовать:

use App\Providers\MyBindingFacade as MyBinding;

Который на самом деле вызовет сделать это с помощью «my.binding».

0

По вопросам рекламы [email protected]