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

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

Route::currentRouteName()

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

Спасибо.

Ответ 1

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

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

Он выводит мое имя маршрута как slug.posts.show

Обновить. Для такого метода, как POST, PUT или УДАЛИТЬ, вы можете сделать это

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 для более подробной информации.

Ответ 2

Я не думаю, что это можно сделать с готовым 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');

Ответ 3

Это можно сделать без расширения класса \Iluminate\Routing\Router по умолчанию.

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

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