#php #laravel #routing
#php #laravel #маршруты
Вопрос:
В Laravel мы можем получить имя маршрута из текущего URL-адреса с помощью этого:
Route::currentRouteName()
Но как мы можем получить имя маршрута по конкретному заданному URL?
Спасибо.
Комментарии:
1. Можете ли вы объяснить, что вы пытаетесь сделать?
2. @TunaMaxx Я пытаюсь получить название маршрута по заданному URL, а не текущему URL.
3. Нет, я полностью понимаю, но я не понимаю, зачем вам это нужно делать. По сути, вы хотите перепроектировать routes.php файл.
4. Это не очень хороший шаблон
5. Если бы вы могли объяснить почему, мы могли бы найти другой способ
Ответ №1:
Очень простой способ сделать это 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'))
это вернет IlluminateRoutingRoute
экземпляр, в котором вы можете вызвать несколько полезных общедоступных методов, таких как getAction
, getValidators
и т.д. Проверьте источник https://github.com/illuminate/routing/blob/master/Route.php для получения дополнительной информации.
Ответ №2:
Ни одно из решений, приведенных выше, не сработало для меня.
Это правильный способ сопоставления маршрута с URI:
$url = 'url-to-match/some-parameter';
$route = collect(Route::getRoutes())->first(function($route) use($url){
return $route->matches(request()->create($url));
});
Другие решения выполняют привязки к контейнеру и могут испортить ваши маршруты…
Ответ №3:
Я не думаю, что это можно сделать с помощью готового Laravel. Также помните, что не все маршруты в Laravel имеют имена, поэтому вы, вероятно, хотите получить объект route, а не название маршрута.
Одним из возможных решений было бы расширить IluminateRoutingRouter
класс по умолчанию и добавить общедоступный метод к вашему пользовательскому классу, который использует защищенный Router::findRoute(Request $request)
метод.
Упрощенный пример:
class MyRouter extends IlluminateRoutingRouter {
public function resolveRouteFromUrl($url) {
return $this->findRoute(IlluminateHttpRequest::create($url));
}
}
Это должно вернуть маршрут, соответствующий указанному вами URL, но я на самом деле это не тестировал.
Обратите внимание, что если вы хотите, чтобы этот новый пользовательский маршрутизатор заменил встроенный, вам, вероятно, придется также создать новый ServiceProvider для регистрации вашего нового класса в контейнере IoC вместо стандартного.
Вы могли бы адаптировать ServiceProvider в приведенном ниже коде к вашим потребностям:
https://github.com/jasonlewis/enhanced-router
В противном случае, если вы просто хотите вручную создать экземпляр своего пользовательского маршрутизатора в своем коде по мере необходимости, вам нужно будет сделать что-то вроде:
$myRouter = new MyRouter(new IlluminateEventsDispatcher());
$route = $myRouter->resolveRouteFromUrl('/your/url/here');
Ответ №4:
Это может быть сделано без расширения класса по умолчанию IluminateRoutingRouter
.
Route::dispatchToRoute(Request::create('/your/url/here'));
$route = Route::currentRouteName();
Если вы вызываете Route::currentRouteName()
после dispatchToRoute
вызова, он вернет текущее имя маршрута отправленного запроса.