将复杂参数传递给路由中间件
有没有办法将复杂参数(例如对象数组)传递给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
参数中间件,以及阵列将是不同的路线通过全球化,所以通过不同情境是不行的。
里面虽然我仍然在这里您将设置该参数不知道,如果你想通过从你的路由文件,通过它,你可以尝试的东西要么
分组:
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
,其也可以在中间件上下文中访问被传递
我不确定这种解决方法是否适用于您当前的情况,但它可能会使您处于正确的方向。
谢谢,这就是我一直在寻找的! –
我建议您评估您的参数中间件
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;
}
}
嗯,这不是我要找的。我知道我可以从任何上下文(包括中间件)访问全局变量(配置变量只是奇特的全局变量),但这不是解决问题的办法,只是奇怪的解决方法。为什么不?我可以将参数传递给例如油门中间件,或者可以使用中间件,这非常好。我想用我的中间件做同样的事情,但不是像'60'那样传递字符串来扼制我想要传递数组像'[1,2,function(){...}]到中间件。全局变量不能解决任何问题。 –
@ Kacper'Kadet'Donat而不是传递一个变量,你有没有想过给你的中间件添加一个受保护的函数,它会做逻辑来确定节流阀的数量? – Wistar
那么,怎么样?这仍然不能解决我的问题 - 将复杂的参数传递给中间件。如果这是不可能的 - 那么很好,我会找到一些更好或更糟的解决方法,像你的。哦,如果这是不可能的,那么请更新您的答案与该信息,因为现在它不是一个问题的答案'如何传递参数而不是字符串中间件?',我会接受并投票它的一些一种有效的解决方法:) –
你能提供一个你正试图实现的例子吗? – Wistar
这个变量从哪里来?请分享一些代码和工作流程。 –
@Wistar我已经添加了示例代码 –