根据用户角色,在边栏中显示/隐藏菜单(Laravel / Spatie)

时间:2019-08-11 13:22:22

标签: laravel laravel-5

我的应用程序中有2个角色,分别是adminformer。有关信息,权限也可以。

现在,我的问题是,如果用户Former已连接。他可以看到标题“ Admin”,是否可以仅保留标题formers

enter image description here

您知道要在哪里进行更改吗? 我在控制器还是中间件之间犹豫不决?

在我的blade.php文件中,我有这个:

  <li class="px-nav-item">
   @if (!Auth::guest())
   <a href="/admin"><i class="px-nav-icon ion-grid"></i><span class="px-nav-label">Listing admin</span></a>
   @endif
  </li>
  <li class="px-nav-item">
    @if (!Auth::guest())
    <a href="/formers"><i class="px-nav-icon ion-grid"></i><span class="px-nav-label">Listing formers</span></a>
    @endif
  </li>

3 个答案:

答案 0 :(得分:1)

您可以使用spatie内置方法来获取当前的登录用户角色。

@if(in_array("admin", Auth::user()->roles->toArray()))
//if your login user role is admin show the content here
@endif

@if(in_array("former", Auth::user()->roles->toArray()))
//if your login user role is former show the content here
@endif

我没有测试这段代码,希望对您有帮助。

答案 1 :(得分:1)

一个好的解决方案是编写View Composer来根据不同的条件(在您的情况下根据用户信息)创建菜单。 例如,您可以使用一个视图编辑器来创建一个链接项数组,然后在视图中访问该数组,并使用给定的链接项数组构建菜单:

<?php

namespace App\Providers;

use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;

class ViewServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        //
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        View::composer(
            'layout', 'App\Http\View\Composers\MenuComposer'
        );
    }
}
<?php

namespace App\Http\View\Composers;

use Illuminate\View\View;

class ProfileComposer
{
    /**
     * Bind data to the view.
     *
     * @param  View  $view
     * @return void
     */
    public function compose(View $view)
    {
        $menu = [];
        if (!\Auth::guest()) {
          $menu[] = ['link' => '/admin', 'text' => 'Listing admin'];
        }

        if (!\Auth::guest()) {
          $menu[] = ['link' => '/formers', 'text' => 'Listing formers'];
        }

        $view->with('menu', $menu);
    }
}

因此,在您的layout.blade.php中,您可以访问$menu变量

@foreach($menu as $link)
<li class="px-nav-item">
   <a href="{{$link['link']}}"><i class="px-nav-icon ion-grid"></i><span class="px-nav-label">{{$link['text']}}</span></a>
</li>
@endforeach

答案 2 :(得分:0)

如果您使用的是Spatie's Laravel-permission,则只需在Laravel刀片中执行此操作即可:

@role('admin')
//Show some button
@endrole

@role('former')
//Show some button
@endrole