Невозможно увидеть @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
часть.