Laravel 4除了控制器构造函数中的过滤器

时间:2013-06-12 21:54:11

标签: php laravel laravel-4

目前我有一个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');

2 个答案:

答案 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;类中有Filtervendor/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中使用,但根据源代码和文档,它应该可以使用。