首页 > 解决方案 > Laravel 7 门中多个授权的冗长代码是什么?

问题描述

我正在App\Providers\AuthServiceProvider为用户角色定义大门。用户对他们的角色有价值。like : (1,2,3,4)在用户管理中赋予的角色和所有用户都可以拥有多个授权。

用户角色是:

为了隐藏侧边栏中的一些信息,我使用了 Blade 指令(@can)。我需要根据每个用户的授权隐藏侧边栏中的部分。

我使用的有效且漫长的方法是:

AuthServiceProvider.php

....

        Gate::define('personnel-method', function ($user) {
        if(in_array(1,explode(",",$user->yetki)))
            return true;
        else
            return false;

    });

    Gate::define('add-method', function ($user) {
        if(in_array(2,explode(",",$user->yetki)))
            return true;
        else
            return false;

    });

    Gate::define('user-method', function ($user) {
        if(in_array(3,explode(",",$user->yetki)))
            return true;
        else
            return false;

    });

    Gate::define('adding-method', function ($user) {
        if(in_array(4,explode(",",$user->yetki)))
            return true;
        else
            return false;

    });

.....

sidebar.blade.php:

<ul>
 @can('personnel-method') <li>Personnel Edit </li> @endcan
 @can('add-method') <li>Add institution</li>@endcan
 @can('user-method')<li>User Management</li>@endcan
 @can('adding-method') <li>Adding Record</li>@endcan
</ul>

那么有没有更简洁的代码来做到这一点?

标签: phplaravellaravel-7

解决方案


您可以使用属性转换。您可以使用“数组”转换并将数据库中的值更改为 JSON ( [1,2,3,4]),或者定义一个自定义转换来拆分字符串。

使用array演员表:

class User extends Model {

  protected $casts = [
    'yetki' => 'array',
  ];

  //...
}

因此,您可以将门更改为:

Gate::define('personnel-method', function ($user) {
  if(in_array(1, $user->yetki))
    return true;
  else
    return false;
});

而且由于您正在检查布尔值,因此您不必使用 anif并且只需返回条件:

Gate::define('personnel-method', function ($user) {
  return in_array(1, $user->yetki);
});

为了使其更易于阅读,您可以将该逻辑移动到User类上的方法中:

class User extends Model {
  public function hasRole($role)
  {
    return in_array($role, $this->yetki);
  }
}

最后,您可以在类中定义角色:

abstract class UserRole {
  const Personnel_Edit = 1;
  const Add_institution = 2;
  const User_Management = 3;
  const Adding_Record = 4;
}

并将门更改为:

Gate::define('personnel-method', function ($user) {
    return $user->hasRole(UserRole::Personnel_Edit);
});

推荐阅读