Php Laravel从给定URL获取路由名称

Php Laravel从给定URL获取路由名称,php,laravel,routing,Php,Laravel,Routing,在Laravel中,我们可以通过以下方式从当前URL获取路由名称: Route::currentRouteName() 但是,我们如何从特定的URL获取路由名称呢 谢谢。我认为没有现成的Laravel是无法做到这一点的。还请记住,并非Laravel中的所有路由都已命名,因此您可能希望检索路由对象,而不是路由名称 一种可能的解决方案是扩展默认的\Iluminate\Routing\Router类,并向使用受保护的Router::findulote(Request$Request)方法的自定义类添

在Laravel中,我们可以通过以下方式从当前URL获取路由名称:

Route::currentRouteName()
但是,我们如何从特定的URL获取路由名称呢


谢谢。

我认为没有现成的Laravel是无法做到这一点的。还请记住,并非Laravel中的所有路由都已命名,因此您可能希望检索路由对象,而不是路由名称

一种可能的解决方案是扩展默认的
\Iluminate\Routing\Router
类,并向使用受保护的
Router::findulote(Request$Request)
方法的自定义类添加公共方法

一个简化的例子:

class MyRouter extends\Lightning\Routing\Router{
公共函数resolveRouteFromUrl($url){
返回$this->findulote(\illumb\Http\Request::create($url));
}
}
这应该返回与您指定的URL匹配的路由,但我还没有实际测试过

请注意,如果您希望这个新的自定义路由器替换内置路由器,您可能还必须创建一个新的服务提供商,将您的新类注册到IoC容器中,而不是默认类

您可以根据自己的需要调整以下代码中的服务提供商:

否则,如果您只想根据需要在代码中手动实例化自定义路由器,则必须执行以下操作:

$myRouter = new MyRouter(new \Illuminate\Events\Dispatcher());
$route = $myRouter->resolveRouteFromUrl('/your/url/here');

无需扩展默认的
\Iluminate\Routing\Router
类即可完成

    Route::dispatchToRoute(Request::create('/your/url/here'));
    $route = Route::currentRouteName();

如果在调用dispatchToRoute后调用
Route::currentRouteName()
,它将返回已发送请求的当前路由名称。

一种非常简单的方法
Laravel 5.2

app('router')->getRoutes()->match(app('request')->create('/qqq/posts/68/u1'))->getName()
它输出我的路线名称,如下所示
slug.posts.show

app('router')->getRoutes()->match(app('request')->create('/qqq/posts/68/u1'))->getName()
更新:对于发布放置删除等方法,您可以这样做

app('router')->getRoutes()->match(app('request')->create('/qqq/posts/68/u1', 'POST'))->getName()//reference https://github.com/symfony/http-foundation/blob/master/Request.php#L309

另外,当您运行
app('router')->getRoutes()->match(app('request')->create('/qqq/posts/68/u1','POST')
时,这将返回
illighted\Routing\Route
实例,您可以在其中调用多个有用的公共方法,如
getAction
getValidators
等。有关更多详细信息,请查看源代码。

以上所有解决方案都不适合我

这是将路由与URI匹配的正确方法:

$url = 'url-to-match/some-parameter';

$route = collect(\Route::getRoutes())->first(function($route) use($url){
   return $route->matches(request()->create($url));
});

其他解决方案执行到容器的绑定,可能会破坏您的路由…

您能解释一下您要做什么吗?@TunaMaxx我试图从给定的URL而不是当前URL获取路由名称。不,我完全理解,但我不明白您为什么需要这样做。从本质上说,您希望对routes.php文件进行反向工程。这不是一个好模式。如果您能解释原因,我们可以找到另一种特别有用的方法,因为a)它在Laravel 5.1中工作,b)它无需扩展默认类。非常感谢!同样适用于Laravel 5.4。谢谢你,先生!