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() 在生成视图时他返回了这个: 编译为<?php if(@can('permission1') || @can('permission2')): ?>
。请注意,@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 子句的主要内容,如果未能解决你的问题,请参考以下文章