Laravel 5.1 @can, как использовать предложение OR

Я не нашел, как использовать предложение (ИЛИ, И) в поле зрения с @can для проверки нескольких возможностей ...

Я пытался:

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

Но не работает; (


person Marcaum54    schedule 09.12.2015    source источник


Ответы (8)


Вы можете использовать фасад Gate:

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

@endif
person tommy    schedule 09.12.2015
comment
Есть ли разница от @can и этого способа? в данном случае что? - person LorenzoBerti; 27.07.2017

Директива @canany blade добавлена ​​в Laravel v.5.6.23 24 мая 2018 г.

Использование:

@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
person Jasper Briers    schedule 19.07.2018
comment
Вы знаете, поддерживает ли @canany передачу модели политики? Например, с @ can вы можете сделать @ can ('edit', 'App \ Post'). - person Scott Salisbury; 04.11.2018
comment
@ScottSalisbury вы можете использовать, например, @canany(['post.update', 'post.create'], [$post]) Но это не идеально, поскольку это один и тот же аргумент для обеих политик. Я бы порекомендовал сделать свою собственную директиву для приведенного мной примера. - person Clément Baconnier; 18.04.2019

Я добавил эту директиву в свое приложение 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

Вот документ по расширению Blade на 5.4

person SimonDepelchin    schedule 16.08.2017
comment
Очень хорошо! Это должно быть в ядре Laravel. - person titleistfour; 08.02.2018

Вы можете звонить @can несколько раз.

@if (@can ('разрешение1') || @can ('разрешение2'))

@if( Gate::check('permission1') || Gate::check('permission2') )
person jfadich    schedule 09.12.2015
comment
@ Marcaum54 Что насчет того, что не работает? Выдает ошибку? - person jfadich; 10.12.2015
comment
Ошибка отслеживания: FatalErrorException в /.../0681985e98a64fda6c3db7d157508293, строка 53: Вызов неопределенной функции can () при генерации представления, которое он вернул: ‹? Php if (@can ('inscricoes') || @can ('inscricoes-opec')):? › - person Marcaum54; 10.12.2015
comment
Это компилируется в <?php if(@can('permission1') || @can('permission2')): ?>. Обратите внимание, что @can() является допустимым вызовом функции (символ at подавляет предупреждения), но метод can () не существует. - person tommy; 10.12.2015

Используйте метод can на Authenticated User,

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

@endif
person dilbadil    schedule 10.03.2019

Если вы используете laravel spatie package, вы можете легко сделать это следующим образом ..

Использование метода hasAnyPermission ()

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

person dipenparmar12    schedule 06.03.2020

@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

person MUHAMMAD USMAN    schedule 19.01.2021

просто используйте @canany (['permision1', 'permision2'])

person iwan    schedule 02.02.2021
comment
Пожалуйста, не размещайте код без объяснения причин в качестве ответа. Попытайтесь объяснить, что делает ваш код и как он решает проблему вопроса. Ответы с объяснением обычно более полезны и качественнее, и с большей вероятностью соберут положительные голоса. - person Zsolt Meszaros; 02.02.2021