在laravel 5
问题描述:
从中间件获取当前路由操作名字我有这样的一个中间件:在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()
总是返回null
,我认为它是因为路由器没有分派与请求。
注:我将自己的中间件Kernal.php
全球中间件每个请求为以下
protected $middleware = [
.
.
.
'App\Http\Middleware\PermissionsHanlderMiddleware',
];
我想路由操作名称$next($request)
执行之前做一些权限操作之前运行。我怎样才能做到这一点 ?
答
如果尚未分派路由器,则无法获取路由操作名称。路由器类还没有做到 - 所以你不能做$router->request()
- 它只会是空的。
如果它会作为routeMiddleware为$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();
}
}
我需要'actionName'因为我把它传递给Doctine SimpleAnnotationReader来获得一些注释,所以'$ request-> segments()'不会帮助我。有没有其他方法可以在所有请求中执行我的中间件来检查权限。 – 2015-02-24 14:58:27
有一种方法 - 请参阅我编辑的答案。在路由器启动的时候可能会有一种手动调用中间件对象的方法 - 但我不能把它当作这个阶段来考虑 - 明天我会玩弄它 – Laurence 2015-02-24 15:21:20