Home > database >  Laravel 7 - Roles and Permissions
Laravel 7 - Roles and Permissions

Time:01-06

I am having trouble restricting menu options for user roles in Laravel 7. The menu for 'admin' and 'profesor' are similar but I decided to make two different views for each one and make an @include in the main view.

  • User model
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; 
}
  • My view
<hr >
@if (auth()->user()->hasRoles(['admin']))
  <div >
    <!-- *********************** SERVESCOL ***********************  -->
    <div  id="accordion" role="tablist" aria-multiselectable="true">
      <div >
        <div  role="tab" id="headingOne">
          <h5 >
            <a  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"  role="tabpanel" aria-labelledby="headingOne">
          <div >
            <div  id="sub-accordion" role="tablist" aria-multiselectable="true">
              <div >
                <div  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 >
  @else
    @if(auth()->user()->hasRoles(['profesor']))
    <!-- *********************** SERVESCOL ***********************  -->
      <div  id="accordion" role="tablist" aria-multiselectable="true">
        <div >
          <div  role="tab" id="headingOne">
            <h5 >
              <a  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"  role="tabpanel" aria-labelledby="headingOne">
            <div >
              <div  id="sub-accordion" role="tablist" aria-multiselectable="true">
                <div >
                  <div  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 >
    @endif
  @endif

But both options disappear and the view breaks down. I have also tried it within the views of each menu directly, but in both, the role of 'admin' as in the role of 'profesor', remove the option that covers the @if.

CodePudding user response:

Your hasRoles function could be a bit simpler

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

You could use the @includeWhen directive.

<hr >
<div >
  <!-- *********************** SERVESCOL ***********************  -->
  <div  id="accordion" role="tablist" aria-multiselectable="true">
    <div >
      <div  role="tab" id="headingOne">
        <h5 >
          <a  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"  role="tabpanel" aria-labelledby="headingOne">
        <div >
          <div  id="sub-accordion" role="tablist" aria-multiselectable="true">
            <div >
              <div  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>
  •  Tags:  
  • Related