目前我有一个AdminContoller,它有一个构造方法来处理一些之前的过滤器。除了一个控制器方法之外,有没有办法对所有控制器方法进行过滤?
我正在使用Entrust for Roles and Permissions,但是这段代码让我陷入无限重定向循环。我根本没有以用户身份登录。因此,此代码应将我重定向到/ admin / login url,该URL附加到未经过滤的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');
答案 0 :(得分:5)
当您在资源丰富的控制器中添加新方法时,您应首先在资源之前注册新方法。
E.g。
<?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'));
}
}
答案 1 :(得分:3)
是的,这是可能的,因为public $except;
文件中的public $only;
类中有Filter
和vendor/laravel/framework/src/Illuminate/Routing/Controllers/Filter.php
属性,您也可以使用only
代替except
仅对特定方法使用过滤器。
来自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
中使用,但根据源代码和文档,它应该可以使用。