Фильтр маршрутов Laravel 4 никогда не вызывался

Я уверен, что я делаю что-то не так, что очень очевидно, но по какой-то причине я не могу получить никаких фильтров, кроме App::before, для работы в моем тестовом приложении.

//маршруты.php

Route::get('site/login',
               array(
                    'before'=>'science',
                    'as'=>'site/login',
                    'uses'=>'HomeController@getLogin',
               )
           );
Route::controller(site, 'HomeController');

//фильтры.php

App::before(function($request){
    //var_dump("Before"); exit;
});

Route::filter('science',function(){
   dd("Science B!TCH!");
   exit;
});

//HomeController.php

public function getLogin(){
    $this->layout->body = View::make('home.login');
}

Объект был первым, чтобы гарантировать, что пользователь не вошел в систему, поэтому я пытался использовать встроенный «гостевой» фильтр, но он никогда не вызывался. Поэтому позже я создал «научный» фильтр, чтобы проверить, будут ли работать ЛЮБЫЕ маршруты. Если я раскомментирую строку var_dump в App::before, она отобразит «До» и выйдет, как и ожидалось.

Может ли кто-нибудь увидеть, что я делаю неправильно здесь? Когда я перехожу на страницу /site/login, я должен увидеть цитату из фильма «Во все тяжкие» вместо фактической страницы. Однако я вижу свою форму входа, как будто ничего не происходит.

Спасибо!

ОБНОВЛЕНИЕ: я изменил маршрут, чтобы он выглядел так:

//маршруты.php

Route::get('site/login', 'HomeController@getLogin')->before('science');

... и это работает. Я получаю отладочную строку "НАУКА..." на экране.

Это также работает, если я делаю следующее

//HomeController.php

public function __construct(){
    $this->beforeFilter('science');
}

Существуют ли какие-либо варианты использования или условия, при которых версия маршрутов в виде массива игнорируется?

ОБНОВЛЕНИЕ 2: Пытаясь упростить исходное описание, я забыл показать другие маршруты, которые были в route.php. Посмотрите ниже.

//маршруты.php

Route::get('site/login',
                    array(
                        'before'=>'science',
                        'as'=>'site/login',
                        'uses'=>'HomeController@getLogin'
                    )
                );
Route::post('site/login',
               array(
                    'as'=>'site/login',
                    'uses'=>'HomeController@postLogin'
               )
);

Наличие маршрута POST ПОСЛЕ маршрута GET является причиной проблемы. Когда я помещаю маршрут POST ПЕРЕД маршрутом GET, маршрут GET работает с фильтром, как и ожидалось.

Теперь у меня сложилось впечатление, что Laravel по-разному обрабатывает запросы GET и POST, отсюда и использование разных статических методов в Route. Однако, по-видимому, это не так, так как фильтр на последнем влияет на фильтр на первом.

Это правильное предположение? Мне начать отдельную тему по этому поводу? Я хотел бы понять, почему это работает именно так.

Спасибо!

ОБНОВЛЕНИЕ 3

---- РЕШЕНО ---

Этот лакомый кусочек информации специально не указан в документации, но у вас не может быть одинаковых имен маршрутов, даже если эти имена маршрутов относятся к разным глаголам REST.

//routes.php ДО

Route::get('site/login',  array('as'=>'site/login','uses'=>'HomeController@getLogin', 'before'=>'science'));
Route::post('site/login', array('as'=>'site/login', 'uses'=>'HomeController@postLogin',));

В приведенном выше решении 2-й маршрут ЗАМЕНЯЕТ предыдущий маршрут, потому что «как» использует то же имя. Я думал, что к ним будут относиться по-разному, так как один GET, а другой POST, но это не так. Назначения фильтров должны выполняться по имени в бэкэнде, и поэтому использование одинаковых имен перекрывает друг друга.

//routes.php ПОСЛЕ

Route::get('site/login',  array('as'=>'site/login','uses'=>'HomeController@getLogin', 'before'=>'science'));
Route::post('site/login', array('as'=>'site/postLogin', 'uses'=>'HomeController@postLogin',));

Как вы можете видеть здесь, я переименовал часть массива «как» в «сайт/postLogin», и теперь я могу использовать разные фильтры для каждого POST, GET и, возможно, PUT, DELETE и т. д.


person Wes    schedule 31.10.2013    source источник
comment
Вы изменили какие-либо другие файлы? Какие изменения вы внесли в стартовую папку и т.д.? Я попробовал ваш код, и он сработал для меня.   -  person SamV    schedule 01.11.2013
comment
Я знаю, что это странно, я не вносил никаких изменений в начальную папку или какие-либо другие файлы ядра. Спасибо, что заглянули!   -  person Wes    schedule 01.11.2013
comment
Я предполагаю, что вы просто пробуете Laravel с такого рода проектом, отправьте его в репозиторий github, и сегодня вечером я попробую вашу точную копию?   -  person SamV    schedule 01.11.2013
comment
Я обновил описание с дополнительной информацией. Я могу заставить его работать, если не использую массив для указания параметров маршрута. Я пробую Laravel, но я не уверен, что я могу опубликовать на Github благодаря NDA, которое я подписал в этом проекте.   -  person Wes    schedule 01.11.2013
comment
Какую версию Laravel вы используете, бета-версию? Я предполагаю, что это не так уж и странно. В качестве примечания используйте return View::make('view'); вместо прямой установки атрибута.   -  person SamV    schedule 01.11.2013
comment
Я обновил вопрос с дополнительной информацией. Использование Laravel 4   -  person Wes    schedule 01.11.2013
comment
Прошло много времени с этого вопроса, но я думаю, что знаю, что его вызвало. Недавно у меня была похожая проблема, связанная с КОНЕЧНОЙ СКОРОЙ ЧАСТЬЮ. Если ваше приложение перенаправляется на POST/PATCH/PUT с КОНЕЧНЫМ СЛЕШОМ, Laravel выполнит перенаправление 301 (спасибо?), что сделает его похожим на запрос GET. Вероятно, поэтому, когда у вас есть другое имя маршрута, проблема исчезает, поскольку перенаправление 301 определяет это.   -  person Wes    schedule 04.12.2014


Ответы (2)


Для лучшей практики, если два или более маршрута используют один и тот же фильтр, эти маршруты должны принадлежать к группе. У меня есть ощущение, что это исправит проблему.

Из http://laravel.com/docs/routing#route-groups

Route::group(array('before' => 'auth'), function()
{
    Route::get('/', function()
    {
        // Has Auth Filter
    });

    Route::get('user/profile', function()
    {
        // Has Auth Filter
    });
});
person SamV    schedule 01.11.2013
comment
Спасибо, fruityp, но я обнаружил проблему. Я использовал идентичные имена маршрутов в поле массива as, и это приводило к тому, что последнее переопределяло первое. Я ценю всю вашу помощь! Я просто хочу, чтобы документация объяснила это! - person Wes; 01.11.2013
comment
Не беспокойтесь, отправьте запрос на включение :) - person SamV; 02.11.2013

---- РЕШЕНО ---

Этот лакомый кусочек информации специально не указан в документации, но у вас не может быть одинаковых имен маршрутов, даже если эти имена маршрутов относятся к разным глаголам REST.

//routes.php ДО

Route::get('site/login',  array('as'=>'site/login','uses'=>'HomeController@getLogin', 'before'=>'science'));
Route::post('site/login', array('as'=>'site/login', 'uses'=>'HomeController@postLogin',));

В приведенном выше решении 2-й маршрут ЗАМЕНЯЕТ предыдущий маршрут, потому что «как» использует то же имя. Я думал, что к ним будут относиться по-разному, так как один GET, а другой POST, но это не так. Назначения фильтров должны выполняться по имени в бэкэнде, и поэтому использование одинаковых имен перекрывает друг друга.

//routes.php ПОСЛЕ

Route::get('site/login',  array('as'=>'site/login','uses'=>'HomeController@getLogin', 'before'=>'science'));
Route::post('site/login', array('as'=>'site/postLogin', 'uses'=>'HomeController@postLogin',));

Как вы можете видеть здесь, я переименовал часть массива «как» в «сайт/postLogin», и теперь я могу использовать разные фильтры для каждого POST, GET и, возможно, PUT, DELETE и т. д.

person Wes    schedule 04.11.2013