Я уверен, что я делаю что-то не так, что очень очевидно, но по какой-то причине я не могу получить никаких фильтров, кроме 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 и т. д.
return View::make('view');
вместо прямой установки атрибута. - person SamV   schedule 01.11.2013