传递复杂参数给路由中间件
Pass complex parameter to route middleware
有什么方法可以将复杂参数(例如对象数组)传递给 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
参数,并且该数组对于不同的路由是不同的,因此通过全局上下文是行不通的。
我建议你在中间件中评估你的参数
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;
}
}
虽然我仍然不确定你应该从哪里设置这个参数,如果你想从你的路由文件中传递它,你可以尝试使用
分组:
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();
}
}
我不确定此解决方法是否适用于您当前的情况,但它可以为您指明正确的方向。
有什么方法可以将复杂参数(例如对象数组)传递给 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
参数,并且该数组对于不同的路由是不同的,因此通过全局上下文是行不通的。
我建议你在中间件中评估你的参数
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;
}
}
虽然我仍然不确定你应该从哪里设置这个参数,如果你想从你的路由文件中传递它,你可以尝试使用
分组:
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();
}
}
我不确定此解决方法是否适用于您当前的情况,但它可以为您指明正确的方向。