2016-05-31 2 views
2

Bindings

Я использую привязки в моем поставщике услуг между интерфейсом и реализацией:доступа в Service Provider после применения MiddleWare

public function register() 
{ 
    $this->app->bind('MyInterface', MyImplementation::class); 
} 

Middleware

В моем промежуточном слое, добавить атрибут к запросу:

public function handle($request, Closure $next) 
{ 
    $request->attributes->add(['foo' => 'bar]); 
    return $next($request); 
} 

Теперь, я хочу получитьв моей поставщика услуг

public function register() 
{ 
    $this->app->bind('MyInterface', new MyImplementation($this->request->attributes->get('foo')); // Request is not available 
} 

регистр() вызывается перед нанесением промежуточного уровня. Я знаю.

Я ищу технику, чтобы 'перепривязывают', если request-> attributes-> получить ('Foo') установлен

+1

Но разве это не плохая практика вообще? Запуск SPs является частью процесса начальной загрузки, обработка запроса происходит позже. Это звучит несколько неудобно - изменение процесса загрузки на основе запроса. Разве вы не должны решить свою проблему по-другому? –

+0

Да, ты совершенно прав. Но теперь я должен создавать конкретные реализации, которые не являются хорошо поддерживаемыми. – schellingerht

+0

Почему? Вы могли бы связать другую реализацию с интерфейсом в своем промежуточном ПО на основе параметров $ request –

ответ

8

Попробуйте так:

public function register() 
{ 
    $this->app->bind('MyInterface', function() { 
     $request = app(\Illuminate\Http\Request::class); 

     return app(MyImplementation::class, [$request->foo]); 
    } 
} 

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

+0

Спасибо! Вы имеете в виду отсроченный? – schellingerht

+0

Точно я имею в виду отсроченный. –

+0

Решает ли ваша проблема? –

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