2016-12-03 4 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); 
    } 
} 

를 달성하기 위해 원하는 예입니다 그리고 미들웨어에 $modifiers 매개 변수로

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

을 전달하려면, 그 배열이 때문에 글로벌 지나가는 다른 경로에 대해 서로 다른 것 문맥은 없어.

+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 
    }); 

.. 또는 개별적으로 각 경로에 대해 :

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(); 
    } 
} 
:

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

이 해결 방법을 사용 modifiers의 어레이는 행의 action 또한 미들웨어 컨텍스트에 액세스 할 수있는 전달 될

이 해결 방법이 현재 상황에 적용되는지 확실하지 않지만 올바른 방향으로 안내 할 수 있습니다.

+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() {...}'과 같은 배열을 미들웨어에 전달하고 싶습니다. 전역 변수는 어떤 문제에 대한 해결책이 아닙니다. –

+0

@ Kacper'Kadet'Donat 변수를 전달하는 대신 스로틀 수를 결정하는 논리를 수행하는 보호 된 함수를 미들웨어에 추가 할 생각을 했습니까? – Wistar

+0

글쎄, 어떻게?그리고 이것은 여전히 ​​내 문제에 대한 해결책이 아닙니다. 복잡한 매개 변수를 미들웨어로 전달합니다. 가능하지 않다면 - 좋아, 너와 같이 더 좋거나 나쁠만한 해결 방법을 찾는다. 아, 그리고 이것이 정말로 불가능하다면, 그 정보로 답을 업데이트하십시오. 왜냐하면 지금은 '문자열 이외의 매개 변수를 미들웨어에 전달하는 방법'에 대한 대답이 아니기 때문입니다. 유효한 해결 방법의 종류 :) –