Какая разница между @if и @can в laravel? - PullRequest
0 голосов
/ 30 сентября 2019

Делали проект с разными пользователями. Я заметил, что могу использовать @if, чтобы запретить конкретному пользователю определенную функцию, но я также могу использовать @can. Может кто-нибудь сказать мне, каковы их различия. Я не зарегистрировал никаких политик в AuthServiceProvider, но я все еще могу использовать @can метод. Я просто имею в виду тип пользователя. Я покажу вам некоторый код.

Может

   @can($global_user->role != 0)
            <li class="{{ $mnuname == 'Issue' ? 'active' : '' }}">
              <a href="{{ route('admin.issues') }}" onclick="return LoadingOverlay();">
                <i class="fa fa-list"></i>
                <span>Issue Tracker</span>
              </a>
            </li>
  @endcan

Если

   @if($global_user->role != 0)

        <li class="{{ $mnuname == 'Student' ? 'active' : '' }}">
          <a href="{{ route('admin.students') }}" onclick="return LoadingOverlay();">
            <i class="fa fa-child"></i>
            <span>Students</span>
          </a>
        </li>
@endif

Редактировать: Могу ли я также использовать @can внутри @if операторов, подобных этому?

    @if($global_user->role != 0)
        <li class="treeview
            {{ $mnuname == 'New Issue' ? 'active' : '' }}
            {{ $mnuname == 'Issue' ? 'active' : '' }}
            ">
          <a href="#">
            <i class="fa fa-bug"></i> <span>System Issues</span>
            <span class="pull-right-container">
              <i class="fa fa-angle-left pull-right"></i>
            </span>
          </a>
          <ul class="treeview-menu">

            <li class="{{ $mnuname == 'New Issue' ? 'active' : '' }}">
              <a href="{{ route('admin.issues.create') }}" onclick="return LoadingOverlay();">
                <i class="fa fa-edit"></i>
                <span>Report an Issue</span>
              </a>
            </li>


            @can($global_user->role != 3)
            <li class="{{ $mnuname == 'Issue' ? 'active' : '' }}">
              <a href="{{ route('admin.issues') }}" onclick="return LoadingOverlay();">
                <i class="fa fa-list"></i>
                <span>Issue Tracker</span>
              </a>
            </li>
            @endcan


          </ul>
        </li>
        @endif

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Хорошо, у меня есть несколько (возможно, слишком много) сортов пива, но я попробую:

Помощники @ can действительно предназначены для политика . Хотя намерение состоит в том, чтобы вернуть логическое значение для обеспечения упрощенной функциональности защиты, они помогают обеспечить удобочитаемость при создании политик, так что функциональные возможности комплексной защиты могут оставаться абстрактными для представления и повторно использоваться в нескольких представлениях блейдов в дополнение к методам контроллера, использующим authorize api.

Директива @if - это простой синтаксис стиля блейда if, условно используемый в любом блейд-представлении.

1 голос
/ 30 сентября 2019
Директива

@if используется для визуализации условной части в шаблоне блейда. и директива @can используется для authorize пользователя на основе Gate и Policy в laravel.

@ if пример директивы

@if($global_user->role == admin)

 //only to shows this portion to admin user
@endif

@ can пример директивы

@can($global_user->role == admin)

 //here this portion verify by Gate and policy and middleware only ADMIN role to perform on this portion.
@endcan
...