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

45

我没有找到如何在使用@can时,在视图中使用从句(OR,AND)以检查多个功能...

我尝试过:

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

但是不起作用 ;(

8个回答

52

2018年5月24日,Laravel v.5.6.23新增了@canany指令。

用法:

@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

2
您知道@ canany是否支持传递策略模型吗?例如,使用@ can您可以执行@ can('edit', 'App\Post')。 - Scott Salisbury
1
@ScottSalisbury 你可以使用例如 @canany(['post.update', 'post.create'], [$post])。但这并不是理想的,因为两个策略都使用了相同的参数。我建议你为我提供的示例制作自己的指令。 - Clément Baconnier

48

您可以使用Gate门面:

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

@endif

1
在这种情况下,@can和这种方式有什么区别?哪个更好? - LorenzoBerti

8

我在我的Laravel 5.4应用程序中添加了这个指令,它允许我在我的Blade视图中使用一个新的@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; ?>';
});

在 Blade 视图中的示例:

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

这是关于在5.4上扩展Blade的文档


非常好!这应该是Laravel核心的一部分。 - titleistfour

4
您可以多次调用@can

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

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

@Marcaum54 它哪里出了问题?它报错了吗? - jfadich
跟随错误:在/.../0681985e98a64fda6c3db7d157508293的第53行中的致命错误: 调用未定义的函数can()当生成视图时,返回了以下内容:<?php if( @can('inscricoes') || @can('inscricoes-opec') ): ?> - Marcaum54
2
该代码编译后为 <?php if(@can('permission1') || @can('permission2')): ?>。请注意, @can() 是一个合法的函数调用(at符号抑制警告),但 can() 方法并不存在。 - tommy

3
如果你正在使用laravel的spatie包,那么你可以通过以下方法轻松完成...

使用hasAnyPermission()方法

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


2
使用Authenticated Usercan方法。最初的回答。
@if ( Auth::user()->can('permission1', App\Model::class) || Auth::user()->can('permission2',  App\Model::class) )

@endif

0

@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


-1

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


请不要在回答中只贴代码而没有解释。尽量解释您的代码是如何解决问题的。带有解释的答案通常更有帮助和更高质量,并且更有可能吸引赞同。 - Zsolt Meszaros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接