В настоящее время у меня есть AdminContoller с методом конструктора, который обрабатывает некоторые из ранее фильтров. Есть ли способ сделать фильтр до всех методов контроллера, кроме одного?
Я использую Entrust для ролей и разрешений, но этот код бросает меня в бесконечный цикл перенаправления. Я вообще не вошел в систему как пользователь. Поэтому этот код должен перенаправить меня на URL-адрес / admin / login, который прикреплен к нефильтрованному методу AdminController @ adminLogin. Но это не так?
// Файл AdminController.php
class AdminController extends BaseController { function __construct() { // Is something like this possible? $this->beforeFilter('admin', array('except' => array('adminLogin'))); $this->beforeFilter('csrf', array('on' => 'post')); } public function index() { return "Admin - Index"; } public function adminLogin() { return "Admin Login Form"; } // ... and many more methods }
// Файл Filter.php
Route::filter('admin', function() { if( !Entrust::hasRole('admin') ) // Checks the current user { return Redirect::to('/admin/login'); } });
// Файл Routes.php
Route::resource('admin', 'AdminController'); Route::get('/admin/login', 'AdminController@adminLogin');
Когда вы добавили новый метод в находчивый контроллер, сначала необходимо зарегистрировать новый метод перед ресурсом.
Например
<?php // Routes.php Route::get('/admin/login', 'AdminController@adminLogin'); Route::resource('admin', 'AdminController');
Таким образом, ваши фильтры должны работать так, как вам нужно:
<?php // AdminController.php class AdminController extends BaseController { function __construct() { $this->beforeFilter('admin', array('except' => array('adminLogin'))); $this->beforeFilter('csrf', array('on' => 'post')); } }
Да, это возможно, потому что существует public $except;
и public $only;
свойство в классе Filter
в vendor/laravel/framework/src/Illuminate/Routing/Controllers/Filter.php
и вы также можете использовать его вместо использования фильтра только для определенных методов.
Из документов L4
only
для
$this->afterFilter('log', array('only' => array('fooAction', 'barAction')));
Таким образом, это тоже должно работать
$this->beforeFilter('log', array('except' => array('fooAction', 'barAction')));
В L3
я использовал
$this->filter('before', 'auth')->except(array('login', 'login_ajax', 'fb_login'));
но не использовать в L4
но он должен работать, в соответствии с исходным кодом и документом.