Blade auth()->user() 试图获得 属性 的 non-object

Blade auth()->user() Trying to get property of non-object

我正在使用 spatie 权限包:https://github.com/spatie/laravel-permission

虽然方法 hasAnyPermission 确实存在,但程序包没有检查用户是否有任何权限的指令。

我正在尝试在 blade 中使用以下条件:

@if (auth()->user()->hasAnyPermission(['View Users', 'View Roles']))

这导致 Trying to get property of non-object 错误。

为什么会这样?

编辑

我要 post 布局中的更多代码:

@if (auth()->guest())
    <!-- Guest Menu -->
    <li {{ (request()->is('login') ? 'class=active' : '') }}><a href="{{ route('login') }}">Login</a></li>
    @if (config('lion.allow_registration'))
        <li {{ (request()->is('register') ? 'class=active' : '') }}><a href="{{ route('register') }}">Register</a></li>
    @endif
@else
    <!-- Auth Menu -->
    @if (auth()->user()->hasAnyPermission(['View Users', 'View Roles']))
        <li class="dropdown">
            <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
                Settings <span class="caret"></span>
            </a>
            <ul class="dropdown-menu" role="menu">
                @can('View Users')
                    <li {{ (request()->is('users') ? 'class=active' : '') }}><a href="{{ route('users') }}">Users</a></li>
                @endcan
                @can('View Roles')
                    <li {{ (request()->is('roles') ? 'class=active' : '') }}><a href="{{ route('roles') }}">Roles</a></li>
                @endcan
            </ul>
        </li>
    @endif
    <li class="dropdown">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
            {{ auth()->user()->name }} <span class="caret"></span>
        </a>
        <ul class="dropdown-menu" role="menu">
            <li {{ (request()->is('profile') ? 'class=active' : '') }}><a href="{{ route('profile') }}">Profile</a></li>
            <li><a href="{{ route('logout') }}">Logout</a></li>
        </ul>
    </li>
@endif

此代码在没有条件语句 @if (auth()->user()->hasAnyPermission(['View Users', 'View Roles'])).

的情况下也能完美运行

我最终只是为此创建了一个自定义 blade 指令:

Blade::directive('hasanypermission', function ($permissions) {
    $permissions = explode(',', $permissions);
    $conditional = [];

    foreach ($permissions as $permission) {
        $conditional[] = "Gate::check($permission)";
    }

    return "<?php if (".implode(' || ', $conditional)."): ?>";
});
Blade::directive('endhasanypermission', function () {
    return '<?php endif; ?>';
});

使用方法:

@hasanypermission('Read Users', 'Read Roles')
    <li class="dropdown">
        <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
            Settings <span class="caret"></span>
        </a>
        <ul class="dropdown-menu" role="menu">
            @can('Read Users')
                <li {{ (request()->is('users') ? 'class=active' : '') }}><a href="{{ route('users') }}">Users</a></li>
            @endcan
            @can('Read Roles')
                <li {{ (request()->is('roles') ? 'class=active' : '') }}><a href="{{ route('roles') }}">Roles</a></li>
            @endcan
        </ul>
    </li>
@endhasanypermission