【问题标题】:Laravel 4 except filter in controller constructorLaravel 4 除了控制器构造函数中的过滤器
【发布时间】:2013-06-09 04:27:44
【问题描述】:

目前我有一个带有构造方法的 AdminContoller,用于处理一些之前的过滤器。有没有办法对除一个之外的所有控制器方法进行前置过滤?

我将 Entrust 用于角色和权限,但这段代码让我陷入了无限重定向循环。我根本没有以用户身份登录。因此,此代码应将我重定向到附加到未过滤的 AdminController@adminLogin 方法的 /admin/login url。但它没有?

// 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
}

//过滤器.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 laravel laravel-4


    【解决方案1】:

    由于您已将新方法添加到资源控制器中,因此您应该先注册新方法,然后再注册资源。

    例如

    <?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'));
        }
    }
    

    【讨论】:

    • 不错!所以看起来我所有的代码都很好,在 Laravel 4 中可以使用 before 过滤器中的 'except' 选项。它只是小而非常重要的让路线以正确的方式走。
    【解决方案2】:

    是的,这是可能的,因为在 Filter 文件中的 Filter 类中有一个 public $except;public $only; 属性,并且您还可以使用 only 而不是 except 来仅对特定对象使用过滤器方法。

    来自L4only的文档

     $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 中使用,但根据源代码和文档,它应该可以工作。

    【讨论】:

    • 问题是我定位路线的方式。我添加到 AdminController 的自定义方法(adminLogin)必须在 Route::resource('admin', 'AdminController'); 之前的 routes.php 文件中注册;
    猜你喜欢
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    • 2023-04-09
    相关资源
    最近更新 更多