使用 laravel 在控制器的构造中传递数组

Passing an array in the construct of a controller with laravel

我想知道如何将角色作为数组传递,因为当我尝试在我的控制器构造中执行此操作时,它似乎总是只有管理员。

以下是我的app/controllers/UserscController.php

class UsersController extends BaseController {

    public function __construct()
    {
        parent::__construct();
        $this->beforeFilter('role:Administrator,Owner');
    }
}

以下是我的app/filters.php

Route::filter('role', function($route, $request, $roles)
{
    if(Auth::guest() !== true)
    {
        if(!empty($roles))
        {
            $roles = explode(',', $roles);
            if(count($roles) > 0)
            {
                foreach($roles as $role)
                {
                    if (Auth::user()->role->role_name == $role)
                    {
                        return;
                    }
                }
            }
        }
        return Redirect::to('/youshallnotpass');
    }
});

Laravel 已经在逗号上展开了过滤器参数,以允许将多个参数传递给过滤器。因此,在您的情况下,您实际上已将两个参数传递给过滤器:第一个参数的值为 'Administrator',第二个参数的值为 'Owner'.

因此,两个快速选项是:

更改您在字符串中使用的分隔符。在您的控制器中:$this->beforeFilter('role:Administrator;Owner'); 然后在您的过滤器中:$roles = explode(';', $roles);

或者,不用管控制器代码,而是在过滤器中使用 PHP 的 func_get_args() 函数:

Route::filter('role', function($route, $request)
{
    if(Auth::guest() !== true)
    {
        $roles = array_slice(func_get_args(), 2);
        foreach($roles as $role)
        {
            if (Auth::user()->role->role_name == $role)
            {
                return;
            }
        }
        return Redirect::to('/youshallnotpass');
    }
});

您可以将角色设置为控制器中的参数。要将角色加载到您的过滤器中,您可以这样做:

Route::filter('role', function($route, $request)
{
    if(Auth::guest() !== true)
    {
        $roles = $route->parameter('roles');
        if(!empty($roles))
        {
            foreach($roles as $role)
            {
                if (Auth::user()->role->role_name == $role)
                {
                    return;
                }
            }
        }
        return Redirect::to('/youshallnotpass');
    }
});

注: 在 laraval 4.1 之前你会使用: $roles = $route->getParameter('roles'); 而不是 $roles = $route->parameter('roles');

希望对您有所帮助!