如何将字符串或数组发送到Laravel中间件

时间:2018-07-07 16:51:40

标签: php laravel

我正在研究Laravel,并尝试制作一个ACL系统。我有一个来自myController的角色中间件,我已经通过两种方式向我的RoleMiddleware发送了Role

第一个是发送字符串。

$this->middleware('HasRole:User|Admin|Author');

这样,我在使用dd()函数时会得到一个字符串。

第二种方法是。

$this->middleware('HasRole:User,Admin,Author');

这样,我在使用dd()函数时得到一个数组。 但是此数组仅包含一个值。

这样的结果。

array:1 [▼ 0 => "User" ]

另外两个值AdminAuthor不在此数组中。

我如何同时使用字符串和数组

这是我的中间件。

public function handle($request, Closure $next,$role='')
{


    $roles=is_array($role)? $role: explode('|', $role);
   dd($roles);

    if($request->user()===null)
    {
        return response('Insufficient Access',401);
    }

    if($request->user()->hasAnyRole($roles) || !$roles)
    {
         return $next($request);
    }
      return response('Insufficient Permission',401);
    //return $next($request);
}

3 个答案:

答案 0 :(得分:0)

我可能不完全知道您的问题的答案,但是我建议您使用laravel授权而不是中间件。 see this doc

对于在控制器中遇到的问题,我更喜欢使用此代码:

$this->authorize('update', $post);

或:

if ($user->can('create', Post::class)) {
    // Executes the "create" method on the relevant policy...
}

然后在策略文件中,应指定以下语句:

if ($user->isSuperAdmin() || $user->id === $post->user_id) {
    return true;
}

答案 1 :(得分:0)

如果您希望中间件将字符串自动转换为数组,那么中间件$role的参数应该是这样

public function handle($request, Closure $next, ...$roles)
{
   dd($roles);

    if($request->user()===null)
    {
        return response('Insufficient Access',401);
    }

    if($request->user()->hasAnyRole($roles) || !$roles)
    {
         return $next($request);
    }
      return response('Insufficient Permission',401);
    //return $next($request);
}

然后像这样$this->middleware('HasRole:User,Admin,Author');

使用它

OR

但是,如果您希望其他字符分隔您的角色,例如|,则代码应为

public function handle($request, Closure $next, $role = '')
{
   $roles = explode('|', $role);

   dd($roles);

    if($request->user()===null)
    {
        return response('Insufficient Access',401);
    }

    if($request->user()->hasAnyRole($roles) || !$roles)
    {
         return $next($request);
    }
      return response('Insufficient Permission',401);
    //return $next($request);
}

并像$this->middleware('HasRole:User|Admin|Author');

一样使用它

答案 2 :(得分:0)

您可以同时使用两者,只需在中间件中添加一些代码即可。

public function handle($request, Closure $next,...$role)
{
  //add two line 

   $str_role=explode('|',$role[0]);
   $roleString=$str_role;

     $roles=is_array($role)? $role : is_array($roleString)? $roleString : null;
     //dd($roles);

    if($request->user()===null)
    {
        return response('Insufficient Access',401);
    }

    if($request->user()->hasAnyRole($roles) || !$roles)
    {
         return $next($request);
    }
      return response('Insufficient Permission',401);
    //return $next($request);
}

现在,您可以使用。

  

$ this-> middleware('HasRole:User | Admin | Author');

OR

  

$ this-> middleware('HasRole:User,Admin,Author');