2016-06-27 2 views
1

Что касается названия, то я искал около двух часов для поиска эффективного ответа и неоднократно читал официальную документацию, но без какого-либо дальнейшего шага, учитывая, что я относительно новичок в структуре , Сомнения возникают при поиске правильного пути, чтобы разделить код между контроллерами и я наткнулся на поставщиках услуг, так:Использование поставщиков услуг в контроллерах в Laravel 5.2

  1. Я создал сказать MyCustomServiceProvider;
  2. Я добавил его к массивам providers и aliases в файле app.php;
  3. наконец я создал класс пользовательских хелперов и зарегистрировал это нравится:

    class MyCustomServiceProvider extends ServiceProvider 
    { 
        public function boot() 
        { 
         // 
        } 
    
        public function register() 
        { 
         $this->app->bind('App\Helpers\Commander', function(){ 
    
          return new Commander(); 
    
         }); 
        } 
    } 
    

До сих пор, однако, если я использую это пользовательский класс в контроллере я обязательно нужно добавить путь к это через use заявление:

use App\Helpers\Commander; 

иначе я получить хороший класс не найден исключение и, очевидно, мой контроллер не свою работу.
Я подозреваю, что есть что-то, что ускользает от меня на поставщиках услуг! :-)

ответ

2

До сих пор, однако, если я использую этот пользовательский класс в контроллере я обязательно нужно добавить путь к нему через использование заявления:

`use App\Helpers\Commander;` 

иначе я получить хороший класс не найден исключение и, очевидно, мой контроллер не выполняет свою работу.

Да, вот как это работает. Если вы не хотите использовать полное имя, вместо этого вы можете использовать Facade.

Создание класса Фасад, как это:

class Commander extends Facade 
{ 
    protected static function getFacadeAccessor() { return 'commander'; } 
} 

зарегистрировать услугу:

$this->app->singleton('commander', function ($app) { 
    return new Commander(); 
}); 

добавить псевдоним к вашему config/app.php:

'aliases' => [ 
    //... 
    'Commander' => Path\To\Facades\Commander::class, 
    //... 
], 

и использовать его как Facade:

\Commander::doStuff(); 

О том, почему ваш код по-прежнему работает, даже если вы удалите привязку:

При вводе-подсказку параметр в функцию, и Laravel не знает о типе вы хотите (посредством связывания), Laravel сделает все возможное, чтобы создать для вас этот класс, если это возможно. Поэтому, даже если вы не привязывали класс, Laravel с радостью создаст для вас экземпляр этого класса. Если вам действительно нужна привязка, вы используете интерфейсы. Обычно вы не набираете тип подсказок, а только интерфейс.Но Laravel не может создать экземпляр интерфейса и передать его вам, поэтому Laravel должен знать, как он может построить класс, который реализует необходимый интерфейс. В этом случае вы должны привязать класс (или замыкание, который создает класс) к интерфейсу.

+0

Спасибо за четкое объяснение! Это ответ, который я ожидал, и тот, который я не мог найти! Но что не совсем ясно, так это то, что если я оставил метод «register» пустым, ничего не изменится, мой пользовательский класс «Commander» по-прежнему работает, если я добавлю его путь, поэтому в чем причина регистрации поставщика услуг? – wiredolphin

+0

@ Винсент добавил абзац – tkausl

+0

Теперь все ясно! Еще раз спасибо! – wiredolphin