2016-02-08 2 views
4

У меня есть класс, который я впрыскиваю в контроллер вместе с параметром маршрута. Затем я использую сеттер для установки параметра маршрута в классе.Конструктор инъекции параметра маршрута

маршруты

Route::get('path/of/url/with/{paramVar}', '[email protected]) 

контроллер

class testController 
{ 
    public function testFunc(MyClassInterface $class, $routeParamVar) 
    { 
     $class->setParam($routeParamVar); 
     //do stuff here 
     ... 

поставщик услуг

public function register() 
{ 
    $this->bind('path\to\interface', 'path\to\concrete'); 
} 

Я бы вместо этого хотел, чтобы ввести параметр маршрута в конструктор класса я нагнетание в мой контроллер , Я знаю from this question, что мне нужно использовать контейнер laravel.

Я могу ввести другие параметры маршрута, используя Request::class, но как я могу ввести параметр маршрута маршрута?

Я предполагаю, что я бы в конечном итоге с чем-то вроде этого

class testController 
{ 
    public function testFunc(MyClassInterface $class) 
    { 
     //do stuff here 
     ... 
+0

Можете привести пример? Или показать полный код TestController? – smartrahat

+0

Я уточнил вопрос с дополнительной информацией – myol

ответ

3

Вы можете использовать функцию $router->input('foo') для извлечения параметров маршрута в пределах вашего контейнера службы.

https://laravel.com/api/master/Illuminate/Routing/Router.html#method_input

Таким образом, в поставщика услуг:

public function register() 
{ 
    $this->bind('path\to\interface', function(){ 

     $param = $this->app->make('router')->input('foo'); 

     return new path\to\concrete($param); 

    }); 
} 

В отношении свой комментарий, это не приведет к сокращению кода много, но это может быть лучше в этом случае, чтобы сделать вторую услугу провайдер, что-то вроде FooValueServiceProvider, единственное задание для реализации - извлечь этот параметр из маршрутизатора. Затем в каждой из привязок вы можете разрешить FooValueServiceProvider и извлечь из этого значение. Затем, если вы измените имя параметра маршрута или вам нужно его решить из другого места, кроме маршрута, вам нужно только изменить реализацию этого провайдера.

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

+0

Спасибо Джефф, это работает отлично. Есть ли у вас какие-либо предложения о том, как уменьшить количество кода, когда есть множество привязок, берущих этот единственный параметр? (но возвращая различные бетоны) – myol

+0

@myol обновлен моими мыслями! – Jeff

+0

Интересная идея Jeff, спасибо – myol

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