Intereting Posts
Испытательное соединение Laravel с SOAP WDSL и обработка исключений Определите часовой пояс из широты / долготы без использования веб-сервисов, таких как Geonames.org Заполнение формы HTML-формы с помощью запроса mySQL Какую библиотеку сеансов следует использовать с CodeIgniter? PHP strtotime: Получить предыдущий месяц Насколько важны классы? (PHP) Получить строку запроса URL Вопросы проверки формы с CakePHP Как получить параметр и значения строки запроса с помощью javascript (JQuery)? Пересечение с помощью массивов с числовыми строковыми клавишами Пользовательские агенты для мобильного сайта, изменение домена Предупреждение: simplexml_load_file () : предупреждение ввода-вывода: не удалось загрузить внешний объект Расширение класса Statement PDO PHP-код не позволяет отправлять несколько входных значений через мою форму Почтовые данные отсутствуют при отправке одних и тех же данных в быстрой последовательности

В Laravel: Почему с событием приложения `before`, метод Request :: segment ()` отлично работает и `Route :: currentRouteName ()` does not?

В файле 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() работает нормально.

Что вы на самом деле пытаетесь достичь?