【问题标题】:Laravel 7 - Roles and PermissionsLaravel 7 - 角色和权限
【发布时间】:2022-01-05 01:46:15
【问题描述】:

我在限制 Laravel 7 中用户角色的菜单选项时遇到了麻烦。“admin”和“profesor”的菜单相似,但我决定为每个视图创建两个不同的视图,并在主视图中创建一个 @include。

  • 用户模型
public function roles()
{
    return $this->belongsToMany(Role::class,'assigned_roles');
}
        
public function isAdmin()
{
    return $this->hasRoles(['admin']);
}
        
public function hasRoles(array $roles)
{
    foreach ($roles as $role) {
        foreach ($this->roles as $userRole) {
            if ($userRole->name === $role) {
                return true;
            }
        }
    }
    return false;
}
        
public function userRole()
{
    return $this->role->nombre_rol; 
}
  • 我的看法
<hr class="hr-unam">
@if (auth()->user()->hasRoles(['admin']))
  <div class="sideover">
    <!-- *********************** SERVESCOL ***********************  -->
    <div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
      <div class="panel panel-default">
        <div class="panel-heading" role="tab" id="headingOne">
          <h5 class=" text-center panel-title">
            <a class="txt-unam txt-side font-weight-bold text-uppercase" style="text-decoration:none" role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
              SERVESCOL
            </a>
          </h5>
        </div>
        <div id="collapseOne" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="headingOne">
          <div class="panel-body">
            <div class="panel-group" id="sub-accordion" role="tablist" aria-multiselectable="true">
              <div class="panel panel-default">
                <div class="panel-heading" role="tab" id="subHeadingOne">
                  <a role="button" data-toggle="collapse" data-parent="#sub-accordion" href="#collapseSubOne" aria-expanded="true" aria-controls="collapseSubOne">
                    @include('main.sidebarServescol')
                  </a>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
    <hr class="hr-unam">
  @else
    @if(auth()->user()->hasRoles(['profesor']))
    <!-- *********************** SERVESCOL ***********************  -->
      <div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
        <div class="panel panel-default">
          <div class="panel-heading" role="tab" id="headingOne">
            <h5 class=" text-center panel-title">
              <a class="txt-unam txt-side font-weight-bold text-uppercase" style="text-decoration:none" role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
                SERVESCOL
              </a>
            </h5>
          </div>
          <div id="collapseOne" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="headingOne">
            <div class="panel-body">
              <div class="panel-group" id="sub-accordion" role="tablist" aria-multiselectable="true">
                <div class="panel panel-default">
                  <div class="panel-heading" role="tab" id="subHeadingOne">
                    <a role="button" data-toggle="collapse" data-parent="#sub-accordion" href="#collapseSubOne" aria-expanded="true" aria-controls="collapseSubOne">
                      @include('main.sidebarProfesor')
                    </a>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
      <hr class="hr-unam">
    @endif
  @endif

但是这两个选项都消失了,视图也崩溃了。我也直接在每个菜单的视图中尝试过,但是在这两种情况下,“管理员”的角色和“教授”的角色一样,删除了覆盖 @if 的选项。

【问题讨论】:

  • if (user is admin) { } else { if (user is admin) { ... } } 这是不对的(如果他们到达else,他们不是管理员,所以在那里检查他们是否是管理员总是错误的)......你只有一个@987654325 @path 基本上
  • 哦,是的!抱歉,是我的错。但是还是不行:(

标签: php laravel authentication laravel-blade user-roles


【解决方案1】:

您的hasRoles 函数可能更简单一些

public function hasRoles(array $roles)
{
    return $this->roles->contains(function ($role, $key) use ($roles) {
        return in_array($role->name, $roles);
    });
}

// PHP 7.4 and above
public function hasRoles(array $roles)
{
    return $this->roles->contains(fn($role, $key) => in_array($role->name, $roles));
}

您可以使用@includeWhen 指令。

<hr class="hr-unam">
<div class="sideover">
  <!-- *********************** SERVESCOL ***********************  -->
  <div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
    <div class="panel panel-default">
      <div class="panel-heading" role="tab" id="headingOne">
        <h5 class=" text-center panel-title">
          <a class="txt-unam txt-side font-weight-bold text-uppercase" style="text-decoration:none" role="button" data-toggle="collapse" data-parent="#accordion" href="#collapseOne" aria-expanded="true" aria-controls="collapseOne">
            SERVESCOL
          </a>
        </h5>
      </div>
      <div id="collapseOne" class="panel-collapse collapse in" role="tabpanel" aria-labelledby="headingOne">
        <div class="panel-body">
          <div class="panel-group" id="sub-accordion" role="tablist" aria-multiselectable="true">
            <div class="panel panel-default">
              <div class="panel-heading" role="tab" id="subHeadingOne">
                <a role="button" data-toggle="collapse" data-parent="#sub-accordion" href="#collapseSubOne" aria-expanded="true" aria-controls="collapseSubOne">
                  @includeWhen(auth()->user()->hasRoles(['admin']), 'main.sidebarServescol')
                  @includeWhen(auth()->user()->hasRoles(['profesor']), 'main.sidebarProfesor')
                </a>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  </div>
</div>

【讨论】:

  • 它有点工作,视图看起来不再糟糕,但它不显示菜单上的选项。
  • 您的侧边栏子视图可能有问题
  • 但它以前可以工作。每当我添加角色时,它都会失败。如果我只有@include 它就可以工作。会不会是风景以外的其他东西?
  • 它已经工作了,我的一种方法有问题。非常感谢您的帮助! (:
猜你喜欢
  • 2017-09-13
  • 2014-09-15
  • 2019-04-27
  • 2019-07-31
  • 2022-01-01
  • 2021-02-02
  • 2016-05-22
  • 1970-01-01
  • 2020-11-01
相关资源
最近更新 更多