【问题标题】:Laravel 5.1 @can, how use OR clauseLaravel 5.1 @can,如何使用 OR 子句
【发布时间】:2023-12-25 20:15:01
【问题描述】:

我没有找到如何使用 @can 视图中的子句(OR、AND)来检查多种能力...

我试过了:

@can(['permission1', 'permission2']) 
@can('permission1' or 'permission2')
@can('permission1' || 'permission2')

但不工作;(

【问题讨论】:

    标签: laravel laravel-5.1 blade laravel-blade


    【解决方案1】:

    你可以使用 Gate 门面:

    @if(Gate::check('permission1') || Gate::check('permission2'))
    
    @endif
    

    【讨论】:

    • @can 和这种方式有区别吗?在这种情况下,呢?
    【解决方案2】:

    @canany Blade 指令已于 2018 年 5 月 24 日添加到 Laravel v.5.6.23

    用法:

    @canany(['edit posts', 'delete posts'])
        <div class="actions">
            @can('edit posts')
                <button>Edit post</button>
            @endcan
            @can('delete posts')
                <button>Delete post</button>
            @endcan
        </div>
    @endcanany
    

    【讨论】:

    • 不知道@canany 是否支持传递策略模型?例如使用@can 你可以做@can('edit', 'App\Post')。
    • @ScottSalisbury 你可以使用例如@canany(['post.update', 'post.create'], [$post]) 但这并不理想,因为这两种策略的论点相同。我建议为我提供的示例制定自己的指令。
    【解决方案3】:

    我在我的 Laravel 5.4 应用程序中添加了这个指令,它允许我在刀片视图中使用新的 @canany('write|delete') 指令。

    // AppServiceProvider.php@boot()
    
    Blade::directive('canany', function ($arguments) {
        list($permissions, $guard) = explode(',', $arguments.',');
    
        $permissions = explode('|', str_replace('\'', '', $permissions));
    
        $expression = "<?php if(auth({$guard})->check() && ( false";
        foreach ($permissions as $permission) {
            $expression .= " || auth({$guard})->user()->can('{$permission}')";
        }
    
        return $expression . ")): ?>";
    });
    
    Blade::directive('endcanany', function () {
        return '<?php endif; ?>';
    });
    

    刀片视图中的示例:

    @canany('write|create')
        ...
    @endcanany
    

    这是doc for extending Blade on 5.4

    【讨论】:

    • 非常好!这应该在 Laravel 核心中。
    【解决方案4】:

    您可以多次拨打@can

    @if(@can('permission1') || @can('permission2'))

    @if( Gate::check('permission1') || Gate::check('permission2') )
    

    【讨论】:

    • @Marcaum54 它不起作用怎么办?会报错吗?
    • 跟随错误:FatalErrorException in /.../0681985e98a64fda6c3db7d157508293 line 53: Call to undefined function can() 在生成视图时他返回了这个:
    • 编译为&lt;?php if(@can('permission1') || @can('permission2')): ?&gt;。请注意,@can() 是一个有效的函数调用(at 符号禁止警告),但 can() 方法不存在。
    【解决方案5】:

    Authenticated User 上使用can 方法,

    @if ( Auth::user()->can('permission1', App\Model::class) || Auth::user()->can('permission2',  App\Model::class) )
    
    @endif
    

    【讨论】:

      【解决方案6】:

      如果你正在使用 laravel spatie package ,那么你可以通过以下方式轻松完成..

      使用 hasAnyPermission() 方法

      @if(auth()->user()->hasAnyPermission(['permission1','permission2']))
         // statements 
      @endif
      
      

      【讨论】:

        【解决方案7】:

        @if(Gate::check('manage-users') || Gate::check('add-new-user')) 管理用户

            <li>
              <a href="{{url('/back/users')}}">
                <i class="feather icon-users"></i>
               <span class="menu-item" data-i18n="users">Manage Users</span>
                </a>
            </li>
        

        @endif

        【讨论】:

          【解决方案8】:

          只需使用@canany(['permision1','permision2'])

          【讨论】:

          • 请不要在没有解释的情况下发布代码作为答案。尝试解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。