2016-07-09 2 views
0

Может кто-то помочь мне, все выглядит нормально, но инъекция зависимостей не работает для моего класса.Laravel Dependancy Injection не работает

enter image description here

В реестре данного поставщика услуг, я говорю Laravel блог одноэлементно, и от чтения документации, это должно позволить ему решать, когда я делаю линии 41.

Но это дает мне ошибку говоря следующее:

Argument 1 passed to 
Aaranmcguire\Blog\Providers\AppServiceProvider::setSettings() must 
be an instance of Aaranmcguire\Blog\Blog, none given, called in 
.../aaranmcguire/Blog/src/Providers/AppServiceProvider.php 
on line 25 and defined 

Если удалить строку 41, то я могу успешно DD класс из приложения, подтверждающий его регистрации.

Любые идеи, поскольку я потратил почти час на это?

+0

Что вызывает этот метод 'setSettings()'? – Hammerbot

+1

@El_Matella 'Boot()' в пределах того же ServiceProvider –

+0

@Aaran McGuire Пожалуйста, не добавляйте код в качестве изображений http://meta.stackoverflow.com/a/285557/5510499. –

ответ

2

Зависимость Инъекция происходит только при использовании контейнера IoC/Service для разрешения класса или вызова метода. Если вы вызываете метод самостоятельно и у него есть необходимые аргументы, вы должны передать эти аргументы. Laravel не изменяет работу PHP.

Ни один из них никогда не будет включать в себя инъекцию зависимостей, поскольку они являются прямыми метод вызывает на объект и не использовать контейнер:

$this->anything(); // just a method call 
$something->anything(); // just another method call 

Причину вы получите зависимости конструктора впрыскиваются потому, что эти конкретные классы разрешаются используя контейнер IoC. Обычно фреймворк - это вызывающий код такого кода, а не вы напрямую. Когда инфраструктура вызывает метод в классе, он может использовать контейнер, чтобы сделать этот вызов, в который входит метод Injection.

Контейнер имеет call метод с комментарием:

«Позвони данную Закрытие/класс @ метод и впрыснуть его зависимости.»

Метод провайдеров услуг boot вызывается с помощью контейнера IoC и что метод будет иметь зависимости инжектированных в соответствии с документацией Laravel на поставщиков услуг.

«Вы можете использовать типы подсказок для метода загрузки вашего поставщика услуг. Контейнер службы автоматически вводит любые необходимые вам зависимости ..." Laravel 5.2 Docs - Service Providers - The Boot method

От Illuminate\Foundation\[email protected]:

protected function bootProvider(ServiceProvider $provider) 
{ 
    if (method_exists($provider, 'boot')) { 
     return $this->call([$provider, 'boot']); 
    } 
} 

Приложение использует метод call для вызова метода boot на поставщике, поэтому вы можете ввести-подсказку параметры для метода boot и получить метод Injection. Он напрямую не звонит boot на объект провайдера, он использует контейнер для его вызова.

Чтобы использовать функции contai ner, контейнер должен использоваться.

- Это ссылка на Laravel 5.2, но IoC очень похожа на версии.

2

Вы смешиваете связывание и инъекцию метода.

Binding (Singleton):

public function register() { 
    $this->app->singleton('blog', function() { 
     return new \Blog(); 
    }); 
} 

public function setSettings() { 
    dd($this->app->blog); 
} 

Метод впрыска:

public function setSettings(\Blog $blog) { 
    dd($blog); 
} 

Edit: Закрепление код.

+0

Итак, почему метод инъекции не работает? его высказывание, что я ничего не передаю, это правда, потому что я ожидаю, что он его введет. (если он не работает внутри поставщиков услуг?) –

+0

В документах описывается внедрение метода как функция контроллеров. Поэтому я предполагаю, что он доступен только там. Вы можете просто использовать привязку, удалив строку 41. – b263

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