2016-10-23 3 views
1

У меня есть черта и что trait используется в контроллере. Таким образом, многие функции trait используются в Controller. Controller расширяет базовый контроллер. Controller и BaseController уже имеют свой конструктор.Избегайте инъекции зависимостей конструктора в значении

По каким-то причинам, мне нужен конструктор в признаке также потому, что мне нужна интродукция Constructor Injection в trait. Теперь, когда я помещаю конструктор в trait, конструктор не выполняется.

Для решения этой проблемы я увидел SendsPasswordResetEmails trait в этом месте \vendor\laravel\framework\src\Illuminate\Foundation\Auth\SendsPasswordResetEmails.php. Вы увидите, что функция broker в этом trait, которая возвращает контракт. Таким образом, им не нужна инъекция конструктора, потому что они получают контракт от функции broker.

У меня уже есть ServiceProvider, который выглядит ниже.

class RoleServiceProvider extends \Illuminate\Support\ServiceProvider { 

    public function register() { 
     $this->app->bind(
      'App\Architecture\Contract\Role\IRole', 
      '\App\Architecture\Database\Role\RoleDb' 
     ); 
    } 

    public function provides() { 
     return ['App\Architecture\Contract\Role\IRole']; 
    } 
} 

App\Architecture\Contract\Role\IRole является Договор. \App\Architecture\Database\Role\RoleDb класс Database

Вопрос: Можете ли вы любезно сказать, как бы я подключить эту службу Предоставлять через фасад, как это было сделано в SendsPasswordResetEmails trait избежать Constructor Dependency Injection в trait?

ответ

1

Прежде всего, убедитесь, что вы зарегистрировали своего поставщика услуг у вас config/app.php.

Вы не обязательно должны использовать Facade, как вы могли бы просто использовать app(), чтобы решить вашу зависимость:

$dependency = app('App\Architecture\Contract\Role\IRole'); 

выше будет означать, что $dependency на самом деле является экземпляром RoleDb.

Это, как говорится, не так много, чтобы сделать Facade. Уходя вы текущая структура, создать класс App\Architecture\Facades\Role:

<?php 

namespace App\Architecture\Facades; 

use Illuminate\Support\Facades\Facade; 

class Role extends Facade 
{ 
    /** 
    * Get the registered name of the component. 
    * 
    * @return string 
    */ 
    protected static function getFacadeAccessor() 
    { 
     return 'App\Architecture\Contract\Role\IRole'; 
    } 

} 

Затем вернитесь в файл config/app.php и на дне в aliases массиве добавить следующую строку:

'Role'   => App\Architecture\Facades\Role::class, 

И это Это.

Теперь, возвращаясь к Password::broker(); примеру, это Facade, что есть метод, который фактически разрешает другой Зависимость от так что если вы пытаетесь решить еще один класс из вашего RoleDb этой модели не будет работать для вас.

Вы должны либо использовать app('App\Architecture\Contract\Role\IRole') для разрешения зависимости, либо использовать Facade непосредственно в других методах контроллера.

Надеюсь, это поможет!

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