1

如果 N 个过滤器中至少有一个成功,在 Laravel 中是否有方法允许访问路由?例如:

Route::get('/user/{id}', array('uses' => 'UserController@profile', 'before' => 'requireAdmin|requireIsMe'));

此过滤器将需要requireAdminrequireIsMe来授予对路由的访问权限,但我需要的是一种方法来表示requireAdmin requireIsMe足以允许访问。这可能吗,还是我必须创建一个将它们结合起来的新过滤器(这是一个糟糕的解决方案,因为我必须对所有过滤器组合都这样做)?

过滤器看起来有点像:

Route::filter('requireAdmin', function () {
    if(Session::get('user')->GetRole() != Role.Admin)
        return Redirect::to('/');
});

Route::filter('requireIsMe', function($id) {
    if(Session::get('user')->GetId() != $id)
        return Redirect::to('/');
});

我需要的是:给定这两个过滤器,有没有办法告诉一个路由只有一个需要通过才能让请求正常继续(在这个例子中,管理员和具有匹配 ID 的用户都应该能够继续/user/{id})。这可能吗?还是有更聪明的方法来处理这种过滤?

4

2 回答 2

1

这是一个有点复杂的方法。所以你必须在 global.php 中声明一个新函数:

function getFilters($filters)
{
    $exploded = explode('|', $filters);
    foreach($exploded as $filter)
    {
            $filterClass = ucwords($filter).'Filter';
            $return = with(new $filterClass)->filter();
            if( $return === null ) return strtolower($filter);
    }

    return strtolower($filters);
}

现在接下来的事情是为您的过滤器使用“类”。这是filters.php:

Route::filter('test', 'TestFilter');
Route::filter('test2', 'Test2Filter');

class TestFilter {
    public function filter() {
        if( 1 == 1 ) return Redirect::to('/');
    }
}
class Test2Filter {
    public function filter() {
        if( 1 == 2 ) return Redirect::to('/');
    }
}

最后,您必须在路由上调用“getFilters()”并将所需的过滤器传递给它(而不是 before=> 'test|test2'):

Route::get('test', array('before' => getFilters('test|test2'), function(){
    dd('Hello');
}));

现在解释:

getFilters()函数的目的是在路由上调用过滤器之前对其进行测试,如果其中一个没有返回某些内容,这将使该函数仅返回成功执行 before() 的过滤器。在上面的例子中,test2 会失败,但 test 会成功,所以函数只会将 test 作为过滤器返回给路由。现在,如果 2 个过滤器失败,该函数将返回过滤器字符串,以便 Laravel 处理响应。

注意:最好将 CamelCaseLongName 作为过滤字符串传递,以便getFilters()正确调用相应的类。返回的字符串before将始终为小写。

然后,您可以进行自定义getFilters(),以便它解析字符串以获取冒号后面的内容作为参数,就像使用普通过滤器一样(例如:test|test2:param1,param2')

于 2013-07-18T11:22:03.547 回答
0

真的不知道,但您可以创建一个过滤器来调用这两个并在其中一个调用时返回 true ;)

于 2013-07-10T19:23:12.150 回答