Laravel получает имя маршрута из заданного URL-адреса

В Laravel мы можем получить имя маршрута из текущего URL через это:

Route::currentRouteName() 

Но как мы можем получить имя маршрута по определенному URL?

Спасибо.

Очень простой способ сделать это Laravel 5.2

 app('router')->getRoutes()->match(app('request')->create('/qqq/posts/68/u1'))->getName() 

Он выводит мое имя маршрута, подобное этому slug.posts.show

Обновление : для метода, такого как POST , PUT или DELETE, вы можете сделать это

 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')) это вернет Illuminate\Routing\Route где вы можете вызвать несколько полезных общедоступных методов, таких как getAction , getValidators и т. Д. Для получения более подробной информации проверьте источник https://github.com/illuminate/routing/blob/master/Route.php .

Я не думаю, что это можно сделать с готовым Laravel. Также помните, что не все маршруты в Laravel названы, поэтому вы, вероятно, захотите получить объект маршрута, а не имя маршрута.

Одним из возможных решений было бы расширить класс по умолчанию \Iluminate\Routing\Router и добавить общедоступный метод к вашему пользовательскому классу, который использует защищенный Router::findRoute(Request $request) .

Упрощенный пример:

 class MyRouter extends \Illuminate\Routing\Router { public function resolveRouteFromUrl($url) { return $this->findRoute(\Illuminate\Http\Request::create($url)); } } 

Это должно вернуть маршрут, который соответствует указанному вами URL-адресу, но я на самом деле не проверял его.

Обратите внимание: если вы хотите, чтобы этот новый настраиваемый маршрутизатор заменил встроенный, вам, вероятно, также придется создать новый ServiceProvider для регистрации нового класса в контейнере IoC вместо стандартного.

Вы можете адаптировать ServiceProvider в приведенном ниже коде к вашим потребностям:

https://github.com/jasonlewis/enhanced-router

В противном случае, если вы просто хотите вручную создать свой собственный маршрутизатор в своем коде по мере необходимости, вам нужно будет сделать что-то вроде:

 $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(); 

Если вы вызовете Route::currentRouteName() после вызова dispatchToRoute , он вернет текущее имя маршрута отправленного запроса.