Я не думаю, что вы можете делать то, о чем вы просите, и я думаю, вы не понимаете, как работают провайдеры и для чего они предназначены.
В провайдерах вы обычно говорите, какие привязки между интерфейсами и реализациями, так что когда вы выполняете инъекцию зависимостей в коде приложения, это работает. Я почти уверен, что они не предназначены для создания реальных вещей.
За то, что вы можете сказать о вашем коде, я представляю себе что-то вроде этого:
- репозиторного интерфейса (
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();
...
в вашем коде. Как называется правильный метод?
Macro
является псевдонимом обрабатываются MacroFacade
класса
- Фасад зарегистрирован в IoC с именем
macro
по getFacadeAccessor()
методом MacroFacade
MacroServiceProvider
зарегистрировал MacroService
класс в качестве реализации для macro
- Необходимо создать экземпляр
MacroService
, но он имеет MyRepoInterface
в качестве зависимости
AppServiceProvider
сказал Laravel использовать EloquentMyRepo
когда MyRepoInterfice
требуется
- Так экземпляр
EloquentMyRepo
создаются и используются для создания экземпляра MacroService
Macro
было разрешено к экземпляру MacroService
- Laravel называет
myMacro1()
способ этого случая
Я надеюсь, что это может немного разъяснить, что происходит.
Я попробую сделать то, что вы упомянули. Я не определяю макросы в поставщике услуг, у меня есть файл, который расширяет Illuminate \ Html \ FormBuilder, поэтому я могу вызывать свои макросы как Form :: macro вместо использования Facade. В моем сервис-провайдере я звоню: $ this-> app-> bindShared ('form', ... $ form = new Макросы (...). –
Я не уверен, что понял: вы хотите использовать 'Form: : macro() 'и получить доступ к вашему' macro() 'методу, который расширяет класс' FormBuilder'? –
Это сработало! Я следовал тому, что вы сказали, и теперь он работает. Единственное, что я делаю по-другому, это то, что я используя HtmlServiceProvider вместо поставщика услуг по умолчанию, а также используя класс Macro, который расширяет класс FormBuilder для создания моих макросов, но я делаю все свои запросы на фасаде. –