В 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
, он вернет текущее имя маршрута отправленного запроса.