1

У меня есть следующий класс:Laravel Поставщик услуг обходили

<?php 

namespace App\CustomClasses; 

class Disqus { 

    protected $secretKey; 
    protected $publicKey; 

    public function __construct() 
    { 
     $this->secretKey = 'abc'; 
     $this->publicKey = '123'; 
    } 

    public function payload() 
    { 
    ... 
    }  

} 

Я также создал поставщика услуг (упрощенный сильфона), чтобы связать этот класс с контейнером МОК:

<?php namespace App\Providers; 

use Illuminate\Support\ServiceProvider; 
use App\CustomClasses\Disqus; 

class DisqusServiceProvider extends ServiceProvider { 

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

    public function boot() 
    { 
     // 
    } 

} 

И в мой контроллер:

<?php 

use App\CustomClasses\Disqus; 

class ArticlesController extends Controller { 

    public function view(Disqus $disqus) 
    { 
    ... 
    //$disqus = App::make('Disqus'); 
    return View::make('articles.view', compact(array('disqus'))); 
    } 
} 

проблема заключается в том, что всякий раз, когда я использую переменную $disqus, его не «генерируется» от поставщика услуг, а сам класс Disqus.

Однако, когда у меня есть $disqus = App::make('Disqus');, переменная проходит через поставщика услуг.

Так что мой вопрос, так как связывание существует в Поставщиком услуг, не должны переменная $disqus исходить от DisqusServiceProvider, а не Disqus класса непосредственно, когда я использую его в мой контроллер?

Я что-то упустил?

Заранее благодарим за любую помощь.

ответ

1

Если для действия контроллера требуется объект класса Приложение \ CustomClasses \ Disqus, которое должно быть передано, контейнер службы ищет его сопоставления для имени класса зависимости, чтобы узнать, имеет ли он соответствующую службу. Однако он использует полное имя класса, и по этой причине он не работает правильно в вашем случае.

В поставщике услуг вы связали услугу Disqus, в то время как полное имя класса является App \ CustomClasses \ Disqus. Используйте полное имя класса в провайдере, и оно должно работать.

+0

Это было правильно и решило проблему. Однако, даже если это нормальное поведение, было бы полезно упомянуть в документации: полное имя класса должно использоваться в провайдере, а не только в имени класса (даже с ключевым словом 'use'). –

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