Laravel Gate Define不适用于角色\u id为1的其他用户

Laravel Gate Define不适用于角色\u id为1的其他用户,laravel,laravel-8,laravel-authentication,laravel-authorization,laravel-gate,Laravel,Laravel 8,Laravel Authentication,Laravel Authorization,Laravel Gate,当用户具有角色\u id 1时,中间件中的以下代码工作正常,当我对角色->权限执行dd时,响应为数组 但是在这条线上 if (in_array($role->permissions, $permission)) { 对于角色id不同的所有其他用户,我都会遇到此错误 in#array():参数#2($haystack)必须是array类型,在传递数组的位置指定字符串 我的角色模型 protected $casts = [ 'permissions' => 'array

当用户具有角色\u id 1时,中间件中的以下代码工作正常,当我对角色->权限执行dd时,响应为数组

但是在这条线上

if (in_array($role->permissions, $permission)) {
对于角色id不同的所有其他用户,我都会遇到此错误

in#array():参数#2($haystack)必须是array类型,在传递数组的位置指定字符串

我的角色模型

protected $casts = [
        'permissions' => 'array',
    ];
protected function role()
    {
        return $this->hasOne(Roles::class, 'id', 'role_id');
    }
我的用户模型

protected $casts = [
        'permissions' => 'array',
    ];
protected function role()
    {
        return $this->hasOne(Roles::class, 'id', 'role_id');
    }
我的网络中间件组

\App\Http\Middleware\RolePermissionCheck::class,
我的医疗器械坏了

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Gate;


class RolePermissionCheck
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (!empty(Auth::user()->role_id)) {
            $role = Auth::user()->role;

            Gate::before(
                function () {
                    if (Auth::user()->role_id === 1) {
                        return true;
                    }
                }
            );
            // dd($role->permissions);
            foreach ($role->permissions as $permission) {
                Gate::define(
                    $permission,
                    function ($role) use ($permission) {
                        if (in_array($role->permissions, $permission)) {
                            return true;
                        }
                    }
                );
            }
        }

        return $next($request);
    }
}

不要把我的答案标记为用户告诉你的正确,我将分享一些更好的代码,非常简单和“Laravel方式”的东西

正如用户所说:“问题将出现在
foreach
循环中,用于
Gate
定义。在循环的第一次迭代中(基于您的示例数组),您将有
$action=0
$roles='admin\u role\u manage'
。因此Gate的名称将是
0
。当然,然后
@can('admin\u role\u manage'))
false


因此,您正在设置或获取许多不需要的东西,或者用其他方式表达,您可以拥有更清晰的代码(至少对于
中间件
类)

如果您知道(也许您不知道),您可以将属性建模为您想要的类型,因此您不必执行
json\u decode($user\u role->permissions)
,只需执行
foreach($user\u role->permissions as$role)
,但在执行此操作之前,您需要强制转换它

因此,您的模型将有一个属性
$casts
,如下所示:

protected$casts=[
“权限”=>“数组”,
];
这将允许您执行
$model->permissions=['role_1'、'role_2'、…]$model->permissions=json_encode(['role_1','role_2',…])(这也是处理此问题的Laravel方法)

因此,您的中间件将以如下方式结束:

namespace-App\Http\Middleware;
使用App\Models\User;
使用应用程序\模型\角色;
使用闭包;
使用Illumb\Support\Facades\Auth;
使用照明\支持\立面\大门;
类角色权限检查
{
公共函数句柄($request,Closure$next)
{
如果($role=Auth::user()->role)){
盖特:之前(
函数(用户$User){
如果($user->role\u id=='1'){
返回true;
}
}
);
foreach($role->permissions as$permission){
门::定义(
$permission,
函数($role)使用($permission){
if(在数组中($permission,$role->permissions)){
返回true;
}
}
);
}
}
返回$next($request);
}
}
请注意,我已将
$role->permissions as$roles
的措辞更改为
$role->permissions as$permission
,您的
角色
可以是“作者”,您的权限是
时事通讯管理
品牌标识
报价管理
,等等。所以这不是角色,而是权限


还请记住,我认为您甚至可以为
foreach/define
部分编写更好的代码。

请不要将我的答案标记为用户告诉您的正确答案,我将与您分享一些有更好代码的东西,非常简单和“Laravel方式”的东西

正如用户所说:“问题将出现在
foreach
循环中,用于
Gate
定义。在循环的第一次迭代中(基于您的示例数组),您将有
$action=0
$roles='admin\u role\u manage'
。因此Gate的名称将是
0
。当然,然后
@can('admin\u role\u manage'))
false


因此,您正在设置或获取许多不需要的东西,或者用其他方式表达,您可以拥有更清晰的代码(至少对于
中间件
类)

如果您知道(也许您不知道),您可以将属性建模为您想要的类型,因此您不必执行
json\u decode($user\u role->permissions)
,只需执行
foreach($user\u role->permissions as$role)
,但在执行此操作之前,您需要强制转换它

因此,您的模型将有一个属性
$casts
,如下所示:

protected$casts=[
“权限”=>“数组”,
];
这将允许您执行
$model->permissions=['role_1'、'role_2'、…]$model->permissions=json_encode(['role_1','role_2',…])(这也是处理此问题的Laravel方法)

因此,您的中间件将以如下方式结束:

namespace-App\Http\Middleware;
使用App\Models\User;
使用应用程序\模型\角色;
使用闭包;
使用Illumb\Support\Facades\Auth;
使用照明\支持\立面\大门;
类角色权限检查
{
公共函数句柄($request,Closure$next)
{
如果($role=Auth::user()->role)){
盖特:之前(
函数(用户$User){
如果($user->role\u id=='1'){
返回true;
}
}
);
foreach($role->permissions as$permission){
门::定义(
$permission,
函数($role)使用($permission){
if(在数组中($permission,$role->permissions)){
返回true;
}
}
);
}
}
返回$next($request);
}
}
请注意,我已将
$role->permissions as$roles
的措辞更改为
$role->permissions as$permission
,您的
角色
可以是“作者”,您的权限是
时事通讯管理
品牌标识
报价管理
,等等。所以