В файле Laravel PHP Framework, файле app/filters.php
, в котором вы находите before
и after
событий для приложения, когда я пытался использовать метод Request::segment()
с before
событием, он работал нормально и как ожидалось:
App::before(function($request) { if (strtolower(Request::segment(1)) === 'something') { // code here.. } });
Но когда я попытался использовать метод Route::currentRouteName()
следующим образом:
App::before(function($request) { if (strtolower(Route::currentRouteName()) === 'route_name') { // code here.. } });
Это не сработало, как ожидалось.
Почему с событием before
приложением метод Request::segment()
работает нормально, а Route::currentRouteName()
не работает?
Объект запроса настраивается и создается до того, как объект приложения будет настроен и инстанцирован. Это означает, что когда приложение запускается before
события, объект Request был заполнен его сегментами URL и другими значениями из супер-глобальных запросов PHP.
Объект Router не компетентно настроен и создан для объекта приложения. Если вы посмотрите на определение метода currentRouteName
#File: vendor/laravel/framework/src/Illuminate/Routing/Router.php public function currentRouteName() { return ($this->current()) ? $this->current()->getName() : null; } public function current() { return $this->current; }
Вы увидите, что это работает, действуя на current
свойство объекта. Это свойство объекта устанавливается в методе findRoute
.
#File: vendor/laravel/framework/src/Illuminate/Routing/Router.php protected function findRoute($request) { $this->current = $route = $this->routes->match($request); return $this->substituteBindings($route); }
Основной системный код Laravel не вызывает метод findRoute
до тех пор, пока не будет создан экземпляр объекта приложения и не findRoute
событие before
события. т.е. – когда ваш before
наблюдателем / слушателем стреляет, Ларавель не знает, что такое маршрут.
Ответ прост. Поскольку текущий маршрут пока недоступен. Глобальный before
фильтром выполняется до того, как соответствующий маршрут будет найден и отправлен.
Однако запрос доступен намного раньше, поэтому Request::segment()
работает нормально.
Что вы на самом деле пытаетесь достичь?