Невозможно увидеть @can в представлении лезвия

Я не могу заставить функцию разрешения работать с помощью @can внутри лезвия.

Когда я добавляю @can в лезвие, div исчезает, когда пользователь, вошедший в систему, имеет все разрешения.

Пожалуйста, помогите мне найти, в чем проблема. Заранее спасибо.

Добавлено веб-промежуточное ПО ⇒ \ App \ Http \ Middleware \ RolePermissionCheck :: class,

RolePermissioncheck.php

      <?php

namespace App\Http\Middleware;

use App\Models\Roles;
use Closure;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Auth;

class RolePermissionCheck
{
    public function handle($request, Closure $next)
    {
        if (!empty(Auth::user()->role_id)) {
            $user_id = Auth::user()->role_id;
            $user_role = Roles::where('id', $user_id)->first();
            $user_permissions = json_decode($user_role->permissions);

            Gate::before(
                function ($user) {
                    if ($user->role_id === '1') {
                        return true;
                    }
                }
            );

            foreach ($user_permissions as $action => $roles) {
                Gate::define(
                    $action,
                    function ($user_permissions) use ($roles) {
                        if (in_array($user_permissions, $roles)) {
                            return true;
                        }
                    }
                );
            }
        }
        return $next($request);
    }
}

Массив разрешений, т.е. $ user_permissions в RolePermissionCheck

      array:34 [▼
  0 => "admin_role_manage"
  1 => "newsletter_manage"
  2 => "home_variant"
  3 => "nabvar_settings"
  4 => "doctor_details_manage"
  5 => "home_page_manage"
  6 => "about_page_manage"
  7 => "contact_page_manage"
  8 => "quote_page_manage"
  9 => "order_page_manage"
  10 => "price_plan_page_manage"
  11 => "work_single_page_manage"
  12 => "top_bar_settings"
  13 => "services"
  14 => "works"
  15 => "faq"
  16 => "brand_logos"
  17 => "price_plan"
  18 => "team_members"
  19 => "testimonial"
  20 => "blog_settings"
  21 => "counterup"
  22 => "blogs"
  23 => "form_builder"
  24 => "footer_area"
  25 => "menus_manage"
  26 => "pages"
  27 => "general_settings"
  28 => "quote_manage"
  29 => "order_manage"
  30 => "all_payment_logs"
  31 => "job_post_manage"
  32 => "events_manage"
  33 => "knowledgebase"
]

Синтаксис Blade View:

      @can('admin_role_manage')
  <div class="flex-shrink-0 flex items-center">
    <a href="{{ route('dashboard') }}">
      <x-jet-application-mark class="block h-9 w-auto" />
    </a>
  </div>
@endcan

1 ответ

Не мой ответ как правильный, поскольку пользователь сообщил вам об исправлении, я собираюсь поделиться чем-то, чтобы иметь лучший код, действительно простой и "способ Laravel", который можно сделать.

Как сказал пользователь Autista_z : "проблема будет в foreach петля для Gateопределение. В первой итерации цикла (на основе вашего массива образцов) у вас будет $action = 0 а также $roles = 'admin_role_manage'. Таким образом, название ворот будет 0. Итак, конечно, тогда @can('admin_role_manage') является false".


Итак, вы настраиваете или получаете много вещей, которые не нужны или сформулированы иначе, у вас может быть более четкий код (по крайней мере, для вашего Middleware класс).

Если вы знаете (а может, и не знаете), вы можете привести свойства модели к желаемому типу, поэтому вместо того, чтобы делать json_decode($user_role->permissions) ты можешь просто сделать foreach ($user_role->permissions as $role), но перед тем как это сделать, вам нужно его разыграть.

Итак, ваша модель будет иметь свойство $casts как это:

      protected $casts = [
    'permissions' => 'array',
];

Это позволит вам сделать $model->permissions = ['role_1', 'role_2', ...]; без необходимости делать $model->permissions = json_encode(['role_1', 'role_2', ...]); (а также это способ Laravel справиться с этим).

Таким образом, ваше промежуточное ПО будет выглядеть так:

      namespace App\Http\Middleware;

use App\Models\User;
use App\Models\Roles;
use Closure;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Gate;

class RolePermissionCheck
{
    public function handle($request, Closure $next)
    {
        if ($role = Auth::user()->role)) {
            Gate::before(
                function (User $user) {
                    if ($user->role_id === '1') {
                        return true;
                    }
                }
            );

            foreach ($role->permissions as $permission) {
                Gate::define(
                    $permission,
                    function ($role) use ($permission) {
                        if (in_array($role->permissions, $permission)) {
                            return true;
                        }
                    }
                );
            }
        }

        return $next($request);
    }
}

Смотрите, что я изменил формулировку $role->permissions as $roles к $role->permissions as $permission, ваш role может быть "Writer" и ваши разрешения newsletter_manage, brand_logos, quote_manage, и больше. Так что это не роли, а разрешения.

Также имейте в виду, что, я думаю, у вас может быть даже лучший код для foreach/define часть.

Другие вопросы по тегам