Laravel 5如何获取路由操作名称?

21

我试图获取当前路由动作,但我不确定该如何处理。在 Laravel 4 中,我使用的是 Route::currentRouteAction(),但现在有些不同。

我正尝试在我的控制器中执行 Route::getActionName(),但它一直提示找不到该方法。

<?php namespace App\Http\Controllers;

use Route;

class HomeController extends Controller
{
    public function getIndex()
    {
        echo 'getIndex';
        echo Route::getActionName();
    }
}

我认为该方法被移除是因为在L5中将使用注释创建路由。 - ArjanSchouten
1
@arjan 在L5中,默认情况下是普通路由,与L4相同。在L5中,注释现在是可选的。 - Laurence
13个回答

27

获取操作名称,您需要使用:

echo Route::getCurrentRoute()->getActionName();

而不是

echo Route::getActionName();

3
对我来说,结果是App\Http\Controllers\AdsController@create,因此它不仅是动作名称。是否可能只获取它? - Gediminas Šukys
出现错误 - 找不到类“App\Http\Controllers\Route” - Kamlesh

24
在 Laravel 5 中,您应该使用方法或构造函数注入。这将实现您想要的效果:
<?php namespace App\Http\Controllers;

use Illuminate\Routing\Route;

class HomeController extends Controller
{
    public function getIndex(Route $route)
    {
        echo 'getIndex';
        echo $route->getActionName();
    }
}

1
这个很好用,还有一个问题,如何在中间件中实现这个。例如,我想根据路由自动设置布局中的“视图”。我尝试在handle__construct方法中做同样的事情,但它不起作用。Illuminate\Routing\Route类中的参数#0 [<required> $methods]无法解析依赖项。 - Rob
这个过程自动化得太神奇了,让我感到不舒服。我喜欢确切地知道正在发生什么。 - Szczepan Hołyszewski
1
@SzczepanHołyszewski - 方法注入是 Laravel 5 的标准方式。它并不神奇,只是标准的依赖注入。 - Laurence

11

要仅获取方法名,您可以使用...

$request->route()->getActionMethod()

或者使用外观模式...

Route::getActionMethod()

如何在 Lumen 8.x 中使用中间件?请提供建议。谢谢。 - Kamlesh

7

只获取行为名称(不带控制器名称):

list(, $action) = explode('@', Route::getCurrentRoute()->getActionName());

如何在Lumen 8.x中使用它作为中间件?请给予建议。谢谢。 - Kamlesh

4

相反地

use Illuminate\Routing\Route;

请使用以下内容
use Illuminate\Support\Facades\Route;

如果你想要获取路由的别名,可以使用以下代码:

Route::getCurrentRoute()->getName()

对我不起作用。我正在使用Laravel 8。谢谢。 - Kamlesh

3

要在中间件上获取路由操作名称,我这样做:

<?php
namespace App\Http\Middleware;

use Closure;
use Illuminate\Routing\Router;

class HasAccess {

    protected $router;

    public function __construct(User $user, Router $router)
    {
        $this->router = $router;
    }

    public function handle($request, Closure $next)
    {
        $action_name = $this->router->getRoutes()->match($request)->getActionName();
        //$action_name will have as value 'App\Http\Controllers\HomeController@showWelcome'
        //Now you can do what you want whit the action name 
        return $next($request);
    }
}

编辑:您将无法获取由此中间件保护的路由 :(


2

在Laravel 5.4中仅获取操作名称

explode('@', Route::getCurrentRoute()->getActionName())[1]

没有找到更好的方法,在视图中使用,只需一行代码...


2
在Laravel 5.5中,如果您只想要方法/操作名称,例如show、edit、custom-method等,请执行以下操作:
Route::getCurrentRoute()->getActionMethod() 

无需使用explode或list来获取要调用的实际方法。感谢Laravel的设计者考虑到了这一点。

它可以工作,但如何获取控制器名称,请给我建议。谢谢。 - Kamlesh

1
你可以使用请求本身来获取控制器的详细信息。
$request->route()->getAction()

这似乎在Lumen 5.7中无法工作。有人能告诉我为什么吗?看起来当你安装laravel/lumen时,Illuminate/Routing/Router没有被安装?我说错了吗?我想获取正确的控制器版本,但是我不能更改操作,因为$request-route()是一个数组,并且该数组中没有成员函数调用getAction()方法。 - Aboogie

1
对于Laravel 5.1,请使用:

$route = new Illuminate\Routing\Route();
$route->getActionName(); // Returns App\Http\Controllers\MyController@myAction
$route->getAction(); // Array with full controller info

这个类里有很多有用的方法。请查看代码以获取更多详细信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接