2015-07-16 2 views
2

У меня есть следующая проблема в моем проекте laravel 5. У меня есть поставщик услуг для макросов формы с именем MacroServiceProvider.php. Некоторые макросы должны получать данные из базы данных, я в настоящее время использую модель и получаю результаты с красноречивым, но вместо этого хочу использовать репозитории, поэтому я создал свой репозиторий, но я не могу это прямо передать своему провайдеру услуг.Laravel 5 Репозиторий внутри поставщика услуг

Я хочу что-то вроде этого:

... 
public function register(MyRepoInterface $repo) 
    { 
     $registers = $repo->findAll(); 
     Form::macro... 
    } 
... 

Как я могу это сделать?

Спасибо.

ответ

16

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

В провайдерах вы обычно говорите, какие привязки между интерфейсами и реализациями, так что когда вы выполняете инъекцию зависимостей в коде приложения, это работает. Я почти уверен, что они не предназначены для создания реальных вещей.

За то, что вы можете сказать о вашем коде, я представляю себе что-то вроде этого:

  • репозиторного интерфейса (MyRepoInterface) с реальной реализацией с использованием Eloquent (скажут EloquentMyRepo)
  • фасада, скажет Macro, так что вы можете сделать Macro::myMacro1(), Macro::myMacro2() и т. д.
  • методы myMacro1(), myMacro2() и т. д., используйте репозиторий, чтобы получить данные из базы данных, а затем вызовите некоторые методы из Form фасад

Если я прав, то я предлагаю что-то подобное.

Repository

Определение интерфейса в файле MyRepoInterface.php с

interface MyRepoInterface 
{ 
    public function findAll(); 

    // ... your other repo methods 
} 

и реализации EloquentMyRepo.php с

class EloquentMyRepo implements MyRepoInterface 
{ 
    public function findAll() 
    { 
     // ... do what you need 
    } 
} 

Фасад

Определить фасад файл MacroFacade.php с этим

use Illuminate\Support\Facades\Facade; 

class MacroFacade extends Facade 
{ 
    protected static function getFacadeAccessor() 
    { 
     return 'macro'; 
    } 
} 

Класс обслуживания

Определите макрос класса обслуживания в файле MacroService.php, где вы можете использовать инъекции зависимостей и получить доступ к хранилищу. В этом классе вы определяете свои методы myMacro1() ....

class MacroService 
{ 
    protected $myRepo; 

    public function __construct(MyRepoInterface $myRepo) 
    { 
     $this->myRepo = $myRepo; 
    } 

    public function myMacro1() 
    { 
     // access the repo 
     $items = $this->myRepo->findAll(); 
     // ... do something with $items and finally return a string 
     return Form::macro(...); 
    } 

    public function myMacro2($arg1, $arg2) 
    { 
     // ... use the parameters to do something else 
    } 
} 

Наручники

В файле Providers/AppServiceProvider.php, перейдите к методу register() и добавить

public function register() 
{ 
    // ... 
    $this->app->bind('App\MyRepoInterface', 'App\EloquentMyRepo'); 
    // ... 
} 

так, что при использовании MyRepoInterface в зависимости инъекций, Laravel знает, что должен использовать экземпляр EloquentMyRepo.

Теперь давайте создадим поставщика услуг для вашей службы макросов. Создайте файл Providers/MacroServiceProvider.php и положить в него

namespace App\Providers; 

use Illuminate\Support\ServiceProvider; 

class MacroServiceProvider extends ServiceProvider 
{ 
    public function register() 
    { 
     $this->app->bind('macro', 'App\MacroService'); 
    } 
} 

Теперь, когда нам нужно фасад, который зарегистрирован в качестве macro, используется экземпляр MacroService.

Конфигурация

Мы, наконец, нуждаемся в некоторых изменениях конфигурации. Откройте файл config/app.php, добавить новый поставщик

... 
'providers' => [ 
    ... 
    'App\Providers\AppServiceProvider', 
    ... 
    'App\Providers\MacroServiceProvider', 
], 

(обратите внимание, что MacroServiceProvider объявлен послеAppServiceProvider.)

Добавить псевдоним для фасада:

'aliases' => [ 
    ... 
    'Macro' => 'App\MacroFacade', 
], 

СДЕЛАНО!

Что происходит

Давайте предположим, что вы называете

... 
Macro::myMacro1(); 
... 

в вашем коде. Как называется правильный метод?

  1. Macro является псевдонимом обрабатываются MacroFacade класса
  2. Фасад зарегистрирован в IoC с именем macro по getFacadeAccessor() методом MacroFacade
  3. MacroServiceProvider зарегистрировал MacroService класс в качестве реализации для macro
  4. Необходимо создать экземпляр MacroService, но он имеет MyRepoInterface в качестве зависимости
  5. AppServiceProvider сказал Laravel использовать EloquentMyRepo когда MyRepoInterfice требуется
  6. Так экземпляр EloquentMyRepo создаются и используются для создания экземпляра MacroService
  7. Macro было разрешено к экземпляру MacroService
  8. Laravel называет myMacro1() способ этого случая

Я надеюсь, что это может немного разъяснить, что происходит.

+0

Я попробую сделать то, что вы упомянули. Я не определяю макросы в поставщике услуг, у меня есть файл, который расширяет Illuminate \ Html \ FormBuilder, поэтому я могу вызывать свои макросы как Form :: macro вместо использования Facade. В моем сервис-провайдере я звоню: $ this-> app-> bindShared ('form', ... $ form = new Макросы (...). –

+0

Я не уверен, что понял: вы хотите использовать 'Form: : macro() 'и получить доступ к вашему' macro() 'методу, который расширяет класс' FormBuilder'? –

+0

Это сработало! Я следовал тому, что вы сказали, и теперь он работает. Единственное, что я делаю по-другому, это то, что я используя HtmlServiceProvider вместо поставщика услуг по умолчанию, а также используя класс Macro, который расширяет класс FormBuilder для создания моих макросов, но я делаю все свои запросы на фасаде. –

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