如何将字符串或数组发送到 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"
]
其他两个值 Admin
和 Author
没有出现在这个数组中。
我怎样才能同时使用字符串和数组
这是我的中间件。
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 中间件的主要内容,如果未能解决你的问题,请参考以下文章