1

У меня есть класс, который действует как хранилище (add/get item). Я пытаюсь связать его как singleton в одном поставщике услуг и разрешить его в другом методе загрузки.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

UPDATE: Добавлен пример кода из WelcomeController.

ответ

2

С этим:

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

Ты говоришь: my.binding одноэлементно и решает экземпляр App\Providers\MyBinding.

Это не означает, что App\Providers\MyBinding зарегистрирован как одиночныйton тоже. То, что вы должны сделать вместо этого заключается в следующем:

$this->app->singleton('App\Providers\MyBinding'); 

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

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

+0

Похоже, я просил IoC о какой-то черной магии. Теперь я понимаю. Спасибо, Лукас! – fakemeta

0

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

use App\Providers\MyBindingFacade as MyBinding; 

Что будет на самом деле призыв сделать это с помощью «my.binding».

+0

Должно ли 'MyBindingFacade' всегда возвращать мне экземпляр за' my.binding'? Не могли бы вы предоставить дополнительную информацию о своем решении? – fakemeta

+0

Я также обновил свой вопрос с помощью образца кода из моего 'WelcomeController', где используется MyBindingFacade'. – fakemeta

 Смежные вопросы

  • Нет связанных вопросов^_^