如何在Laravel中获取中间件路由

Rob*_*Rob 9 php laravel laravel-5

目前,我可以通过将其注入我想要使用它的方法中来获取控制器中的路径.

<?php namespace App\Http\Controllers;

use Illuminate\Routing\Route;

class HomeController extends Controller
{
    public function getIndex(Route $route)
    {
        echo $route->getActionName();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我试图在中间件中执行类似的操作,但无法实现.

<?php namespace App\Http\Middleware;

use Closure;
use Illuminate\Routing\Route;
use Illuminate\Contracts\Routing\Middleware;

class SetView implements Middleware {

    protected $route;

    public function __construct(Route $route)
    {
        $this->route = $route;
    }

    public function handle($request, Closure $next)
    {
        echo $this->route->getActionName();

        return $next($request);
    }
}
Run Code Online (Sandbox Code Playgroud)

得到一个错误.

Unresolvable dependency resolving [Parameter #0 [ <required> $methods ]] in class Illuminate\Routing\Route
Run Code Online (Sandbox Code Playgroud)

不确定该怎么做.不管它是否是一条路线都不在乎,但需要以某种方式获得该动作名称.

Mat*_*row 14

删除你的构造函数/把它设置为默认值;

public function __construct(){}
Run Code Online (Sandbox Code Playgroud)

尝试通过handle方法访问路由,如此;

 $request->route();
Run Code Online (Sandbox Code Playgroud)

所以你应该能够像这样访问动作名称;

 $request->route()->getActionName();
Run Code Online (Sandbox Code Playgroud)

如果路由返回为null,请确保已在App/Http/Kernel.php中注册了中间件,如此;

protected $middleware = [
    ...
    'Path\To\Middleware',
];
Run Code Online (Sandbox Code Playgroud)

以上是针对全球中间件的

对于特定于路由的过滤,'Path\To\Middleware',将中间件数组放在App\Providers文件夹中的RouteServiceProvider.php中.

您还可以通过访问路径对象app()->router->getCurrentRoute().

编辑:

您可以尝试以下方法;

$route = Route::getRoutes()->match($request);
$route->getActionName();
Run Code Online (Sandbox Code Playgroud)

这从路上得到了路线RouteCollection.一定要将它封装在try catch中,因为这会抛出一个NotFoundHttpException.


xno*_*hat 6

对于Laravel 5.1.x

在您的全球中间件中

use Illuminate\Support\Facades\Route;

$route = Route::getRoutes()->match($request);
$currentroute = $route->getName();
Run Code Online (Sandbox Code Playgroud)