4

目前我有一个带有构造方法的 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');
4

2 回答 2

4

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

例如

<?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'));
    }
}
于 2013-06-12T22:49:31.087 回答
3

是的,这是可能的,因为文件中的类中有一个public $except;andpublic $only;属性,您也可以使用而不是仅在特定方法上使用过滤器。Filtervendor/laravel/framework/src/Illuminate/Routing/Controllers/Filter.phponlyexcept

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

于 2013-06-12T22:30:09.047 回答