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

时间:2015-01-07 18:05:33

标签: php 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');
    }
});

2 个答案:

答案 0 :(得分:2)

您可以将角色设置为控制器中的参数。要将角色加载到过滤器中,您可以执行以下操作:

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

希望这有帮助!

答案 1 :(得分:1)

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