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

Posted

技术标签:

【中文标题】如何将字符串或数组发送到 laravel 中间件【英文标题】:How to send a string or an array to laravel middleware 【发布时间】:2018-07-07 16:51:39 【问题描述】:

我正在开发 Laravel 并尝试制作一个ACL 系统。我有一个来自 myController 的角色中间件我已经通过两种方式将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);

【问题讨论】:

在使用$this->middleware('HasRole:User,Admin,Author');时由,而不是|分解 , 为数组定义,所以当给定$this->middleware('HasRole:User,Admin,Author') 时检查is_array() 函数 你使用...$roles作为参数吗? ...$roles 仅适用于 $this->middleware('HasRole:User,Admin,Author') 不适用于 $this->middleware('HasRole:User|Admin|Author'); 见文档https://laravel.com/docs/5.5/middleware#middleware-parameters 【参考方案1】:

我知道可能不完全是您问题的答案,但我建议您使用 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;

【讨论】:

【参考方案2】:

如果您希望中间件自动将您的字符串转换为数组,那么中间件$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');

但是如果你想要一些其他角色来分隔你的角色,比如|,那么代码应该是

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');一样使用它

【讨论】:

【参考方案3】:

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

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

或,

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

【讨论】:

以上是关于如何将字符串或数组发送到 laravel 中间件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 LARAVEL_7 中通过迁移发送多个复选框

Laravel 添加 ?发邮件

如何使用ajax将数据从视图发送到控制器laravel?

Laravel:如何将图像或文件发送到 API

当一个或多个变量为空时,如何将多个变量发送到 laravel 中的视图

如何将数组数据从 vuejs 传递到 laravel api 控制器