Laravel 5.1 @can,如何使用 OR 子句

Posted

技术标签:

【中文标题】Laravel 5.1 @can,如何使用 OR 子句【英文标题】:Laravel 5.1 @can, how use OR clause 【发布时间】:2016-03-15 07:05:59 【问题描述】:

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

我试过了:

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

但不工作;(

【问题讨论】:

【参考方案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'])

【讨论】:

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

以上是关于Laravel 5.1 @can,如何使用 OR 子句的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别