从 laravel 5 中的中间件获取当前路由操作名称
Get current route action name from middleware in laravel 5
我有这样的中间件:
<?php
namespace App\Http\Middleware;
use App\Contracts\PermissionsHandlerInterface;
use Closure;
class PermissionsHanlderMiddleware {
public $permissionsHandler;
function __construct(PermissionsHandlerInterface $permissionsHandler) {
$this -> permissionsHandler = $permissionsHandler;
}
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next) {
$routeAction = $request->route()->getActionName();
/*
do some operations
*/
return $next($request);
}
}
但是 $request->route()
总是 returns null
,我认为这是因为路由器没有随请求一起发送。
注意:我在每个请求之前将我的中间件添加到Kernal.php
全局中间件到运行如下
protected $middleware = [
.
.
.
'App\Http\Middleware\PermissionsHanlderMiddleware',
];
我想在执行$next($request)
之前获取路由动作名称来做一些权限操作。我该怎么做?
如果路由器尚未被调度,则无法获取路由操作名称。路由器 class 还没有完成它的工作 - 所以你不能做 $router->request()
- 它只是空的。
如果它 运行s as routeMiddleware as $routeMiddleware
- 那么你可以做 $router->request()
您可以在路由器 运行 之前在中间件中获取 URI 字符串 - 如果您愿意,可以在那里做一些逻辑:$request->segments()
。也就是说,这样你就可以看到 URI 段是否匹配特定的路由和 运行 一些代码。
编辑:
我很快想到的一种方法就是将所有路线包装在一个组中,如下所示:
$router->group(['middleware' => 'permissionsHandler'], function() use ($router) {
// Have every single route here
});
这是我在项目中做的解决方案:
...
public function handle($request, Closure $next) {
DB::beginTransaction();
$nextRequest = $next($request); //The router will be dispatched here, but it will reach to controller's method sometimes, so that we have to use DB transaction.
$routeName = $request->route()->getRouteName();
if ($checkPassed) {
DB::commit();
return $nextRequest;
} else {
DB::rollback();
}
}
这个也可以
$request->path(); // path
$request->route()->getName()//name of the route
我有这样的中间件:
<?php
namespace App\Http\Middleware;
use App\Contracts\PermissionsHandlerInterface;
use Closure;
class PermissionsHanlderMiddleware {
public $permissionsHandler;
function __construct(PermissionsHandlerInterface $permissionsHandler) {
$this -> permissionsHandler = $permissionsHandler;
}
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next) {
$routeAction = $request->route()->getActionName();
/*
do some operations
*/
return $next($request);
}
}
但是 $request->route()
总是 returns null
,我认为这是因为路由器没有随请求一起发送。
注意:我在每个请求之前将我的中间件添加到Kernal.php
全局中间件到运行如下
protected $middleware = [
.
.
.
'App\Http\Middleware\PermissionsHanlderMiddleware',
];
我想在执行$next($request)
之前获取路由动作名称来做一些权限操作。我该怎么做?
如果路由器尚未被调度,则无法获取路由操作名称。路由器 class 还没有完成它的工作 - 所以你不能做 $router->request()
- 它只是空的。
如果它 运行s as routeMiddleware as $routeMiddleware
- 那么你可以做 $router->request()
您可以在路由器 运行 之前在中间件中获取 URI 字符串 - 如果您愿意,可以在那里做一些逻辑:$request->segments()
。也就是说,这样你就可以看到 URI 段是否匹配特定的路由和 运行 一些代码。
编辑:
我很快想到的一种方法就是将所有路线包装在一个组中,如下所示:
$router->group(['middleware' => 'permissionsHandler'], function() use ($router) {
// Have every single route here
});
这是我在项目中做的解决方案:
...
public function handle($request, Closure $next) {
DB::beginTransaction();
$nextRequest = $next($request); //The router will be dispatched here, but it will reach to controller's method sometimes, so that we have to use DB transaction.
$routeName = $request->route()->getRouteName();
if ($checkPassed) {
DB::commit();
return $nextRequest;
} else {
DB::rollback();
}
}
这个也可以
$request->path(); // path
$request->route()->getName()//name of the route