Laravel:如何获取当前路由名称?(v5 ... v7)

308

在Laravel v4中,我能够使用...来获取当前路由的名称。

Route::currentRouteName()

我该如何在Laravel v5Laravel v6中做到这一点?


我应该使用哪个命名空间来查找路由名称?我已经使用了Illuminate\Support\Facades\Route,但结果为空。 - Md Rashedul Hoque Bhuiyan
那是正确的类。你的路由可能没有分配名称。请注意,路由名称和URI不同。 - lukasgeiter
这是正确的答案: http://stackoverflow.com/questions/27397487/get-current-path-outside-of-route - Kamil Kiełczewski
1
你为什么需要它? - Yevgeniy Afanasyev
34个回答

588

试一试

Route::getCurrentRoute()->getPath();
或者
\Request::route()->getName()

从v5.1版本开始

use Illuminate\Support\Facades\Route;
$currentPath= Route::getFacadeRoot()->current()->uri();

Laravel v5.2

Route::currentRouteName(); //use Illuminate\Support\Facades\Route;

或者如果您需要操作名称

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

Laravel 5.2 路由文档

获取请求URI

path方法返回请求的URI。因此,如果传入请求的目标为http://example.com/foo/bar,则path方法将返回foo/bar

$uri = $request->path();
is方法允许您验证传入的请求URI是否与给定的模式匹配。当使用此方法时,您可以使用*字符作为通配符:
if ($request->is('admin/*')) {
    //
}

要获取完整的URL,而不仅仅是路径信息,可以在请求实例上使用url方法:

$url = $request->url();

Laravel v5.3 ... v5.8

$route = Route::current();

$name = Route::currentRouteName();

$action = Route::currentRouteAction();

Laravel 5.3路由文档

Laravel v6.x...7.x

$route = Route::current();

$name = Route::currentRouteName();

$action = Route::currentRouteAction();

**截至2019年11月11日当前版本为6.5**

Laravel 6.x路由文档

可以使用请求来获取路由的选项。

$request->route()->getName();

你有没有想法如何过滤这个,例如如果只想在视图API路由“api / ...”中打印? - utdev
9
Route::currentRouteName(); 很好 :) - EM-Creations
3
也许在版本小于5.7的情况下仍然可以使用它,但是在5.7版本中,您不能静态使用它,而是应该使用request()->route()->getName() - 1stthomas
8
在视图中使用request()辅助函数非常有用。request()->route()->getName()是最佳选项。 - Samuel Shifterovich
1
我已经在Laravel 8版本中尝试了所有三种解决方案,但都没有起作用。 // echo $route = Route::current(); echo $name = Route::currentRouteName(); echo $action = Route::currentRouteAction(); - Kamlesh
显示剩余4条评论

43

使用 Laravel 5.1,您可以使用

\Request::route()->getName()

2
这也适用于将其放置在视图中的情况,如 {{ route(\Request::route()->getName()) }}。非常感谢! - bonbon.langes

29

找到了一种适用于 Laravel v5v5.1.28v5.2.10 的获取当前路由名称的方法。

命名空间

use Illuminate\Support\Facades\Route;

$currentPath= Route::getFacadeRoot()->current()->uri();

对于 Laravel v5.3,您只需使用以下代码:

use Illuminate\Support\Facades\Route;

Route::currentRouteName();

@Jonathan 我认为最好始终使用完整的命名空间,以避免任何潜在的冲突。 - Amir Asyraf
有关 Laravel 8 的任何建议吗? - Kamlesh

27

如果您想在多个路由中选择菜单,可以像这样操作:

<li class="{{ (Request::is('products/*') || Request::is('products') || Request::is('product/*') ? 'active' : '') }}"><a href="{{url('products')}}"><i class="fa fa-code-fork"></i>&nbsp; Products</a></li>

或者,如果你只想选择单个菜单,可以像这样简单地执行:

<li class="{{ (Request::is('/users') ? 'active' : '') }}"><a href="{{url('/')}}"><i class="fa fa-envelope"></i>&nbsp; Users</a></li>

也在 Laravel 5.2 中进行了测试

希望这能帮助某些人。


也在 Laravel 5.3 中进行了测试 - Renato Liibke
也在 Laravel 7.5.2 中进行了测试。 - aspirinemaga
在 Laravel 5.7 中进行了测试 - Tariqul Islam
这是最简单的方法,它仍然适用于 Laravel 9.1。谢谢。 - Boss COTIGA

25

如果你需要URL而不是路由名称,你不需要使用/要求任何其他类:

url()->current();

这会返回一个错误:"在非对象上调用成员函数current()。" url()返回的是字符串,而不是对象,所以我认为这从来都不可能起作用。也许你在想其他方法或对象,而不是url()? - thelogix
1
不,我每天都使用它。请查看官方文档 - Fusion
3
我明白了。这只适用于 5.2 或更高版本。但它非常好。 - thelogix

21

在 Laravel 7 或 8 中使用帮助函数。

Get Current Route Name
抱歉,我只能以英语进行交流和回答问题。
request()->route()->getName()
为了检查路由是否当前,最好使用宏来创建自己的请求类方法。
在 `AppServiceProvider` 的 `boot` 方法中:
use Illuminate\Support\Facades\Request;
public function boot()
    {
        Request::macro('isCurrentRoute', function ($routeNames) {
            $bool = false;
            foreach (is_array($routeNames) ? $routeNames : explode(",",$routeNames) as $name) {
               if(request()->routeIs($name)) {
                   $bool = true;
                   break;
                }
             }

             return $bool;
        });
    }

你可以在Blade模板或控制器中使用此方法

request()->isCurrentRoute('foo') // string route
request()->isCurrentRoute(['bar','foo','xyz.*']) //array routes
request()->isCurrentRoute('blogs,foo,bar,xyz.*') //string route seperated by comma

您可以使用Laravel内置的路由方法

request()->routeIs('home');
request()->routeIs('blogs.*'); //using wildcard

在这种情况下,应该使用request()->routeIs('home')来检查路由名称或者request()->is('home')。后者“确定当前请求的URI是否与模式匹配”,而前者“确定路由名称是否与给定模式匹配”。所以我建议使用前者routeIs方法。绝对不是route()->is('home')。您将收到“没有此类方法错误”或route()方法预期1个参数,实际传递0个参数。[来源][ https://laravel.com/api/8.x/Illuminate/Http/Request.html ] - Hmerman6006

15

Laravel 5.2您可以使用

$request->route()->getName()

它将为您提供当前路由名称。


7
实际上这是不正确的。name()方法会添加或更改名称,而getName()方法则返回它。 - Aron Rotteveel

15

在5.2中,你可以直接使用请求:

$request->route()->getName();

或使用辅助方法:

request()->route()->getName();

输出示例:

"home.index"

9

6

最短路径是使用路由门面 \Route::current()->getName()

这在 Laravel 5.4.* 中同样适用。


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