2016-12-03 3 views
0

Есть ли способ передать комплексный параметр (например, массив объектов) в промежуточное ПО в laravel? Я знаю, что могу передавать строки через какой-то DSL, но мне нужно передать некоторые более сложные данные одному из посредников. Возможно ли это? И если да, то как?Пропустить комплексный параметр для маршрутизации промежуточного программного обеспечения

Существует пример того, что я хочу достичь

class Middleware 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next, array $modifiers = null) 
    { 
     foreach($modifiers as $name => $closure) { 
      $request->$name = $closure($request->name) 
     } 
     return $next($request); 
    } 
} 

И я хочу передать

[ 
    'param' => function($param) { return $param * 2; } 
] 

Как $modifiers параметра Middleware, и этот массив будет отличаться для различных маршрутов так, проходящих по глобальным контекст не идет.

+0

Не могли бы вы служить примером того, чего вы пытаетесь достичь? – Wistar

+0

Откуда эта переменная? Предоставьте общий код и рабочий процесс. –

+0

@Wistar Я добавил пример кода –

ответ

1

Хотя я до сих пор не уверен, где вы бы установить этот параметр, в случае, если вы хотите, чтобы передать его через из файла маршрутов, вы могли бы попробовать что-то ни с одним

Группировка:

Route::group(['middleware' => 'somemiddleware'], function() { 
    Route::group(['modifiers' => [ 
    function() { return '1'; }, 
    function() { return '2'; } 
    ]], function() { 
    Route::get('/foo', function() { 
     echo 'bar..'; 
    }); 
    // some other routes here 
    }); 

.. или, индивидуально для каждого маршрута:

Route::group(['middleware' => 'somemiddleware'], function() {  
    Route::get('/foo', ['modifiers' => [ 
     function() { return '1'; }, 
     function() { return '2'; } 
    ], 'uses' => function() { 
     echo 'foo..'; 
    }]); 
}); 

Теперь, с помощью этого метода обхода, массив modifiers будет передан в маршруте action, которые также могут быть доступны в контексте промежуточного слоя:

class Middleware 
{ 
    public function handle($request, Closure $next) 
    { 
    foreach($this->getModifiers($request) as $name => $closure) { 
     $request->$name = $closure($request->name); 
    } 
    return $next($request); 
    } 
    protected function getModifiers($request) { 
    $routeAction = $request->route()->getAction(); 

    return isset($routeAction['modifiers']) ? $routeAction['modifiers'] : array(); 
    } 
} 

Я не уверен, что это обходное решение относится к вашей текущей ситуации, но оно может привести вас в правильном направлении.

+0

Спасибо, это то, что я искал! –

0

Я предлагаю вам оценить ваши параметры внутри промежуточного

class Middleware 
{ 

    public function handle($request, Closure $next) 
    { 
     $modifiers = $this->getModifiers(); 
     foreach($modifiers as $name => $closure) { 
      $request->$name = $closure($request->name) 
     } 
     return $next($request); 
    } 

    protected function getModifiers(){ 

     //Logic you need to get to your param 

     return $param; 
    } 
} 
+0

Ну, это не то, что я ищу. Я знаю, что я могу получить доступ к глобальным vars (Config vars - это просто причудливые глобалы) из любого контекста, включая промежуточное ПО, но это не решение проблемы, а только странное обходное решение. Почему нет? Я могу передавать параметры, например, для промежуточного программного обеспечения дроссельной заслонки или для промежуточного программного обеспечения, и это отлично. Я хочу сделать то же самое с моим промежуточным программным обеспечением, но вместо передачи строки типа '60' для дросселя я хочу передать массив, подобный' [1, 2, function() {...}] 'для промежуточного программного обеспечения. Global var не является решением какой-либо проблемы. –

+0

@ Kacper'Kadet'Donat Вместо того, чтобы передавать переменную, подумали ли вы о добавлении защищенной функции в ваше промежуточное ПО, которое будет делать логику для определения количества дросселей? – Wistar

+0

Ну, как?И это еще не решение моей проблемы - передача сложного параметра в промежуточное ПО. Если это невозможно - тогда хорошо, я найду какое-нибудь лучшее или худшее обходное решение, как ваше. О, и если это действительно невозможно, пожалуйста, обновите свой ответ с помощью этой информации, потому что на данный момент это не ответ на вопрос «Как передать параметр, отличный от строки для промежуточного программного обеспечения?», И я соглашусь и проголосую за него как некоторые вид действительного обходного пути :) –