В файле 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() работает нормально.
Что вы на самом деле пытаетесь достичь?