Просто наткнулся на эту проблему, и я хотел бы поделиться тем, что я нашел и реализовал.
- Добавить аксессор в модели User, которую использует разрешение spatie / laravel
public function getAllPermissionsAttribute() {
$permissions = [];
foreach (Permission::all() as $permission) {
if (Auth::user()->can($permission->name)) {
$permissions[] = $permission->name;
}
}
return $permissions;
}
- На вашей глобальной странице или странице макета передайте разрешение от средства доступа к JavaScript.
<script type="text/javascript">
@auth
window.Permissions = {!! json_encode(Auth::user()->allPermissions, true) !!};
@else
window.Permissions = [];
@endauth
</script>
- Создать глобальную директиву для ресурсов / js / app.js
Vue.directive('can', function (el, binding, vnode) {
if(Permissions.indexOf(binding.value) !== -1){
return vnode.elm.hidden = false;
}else{
return vnode.elm.hidden = true;
}
})
Здесь вы проверяете, находится ли разрешение, которое вы указали в директиве, на массиве разрешений от laravel.
Если он найден, он будет скрывать элемент, показанный еще, эта функция похожа на v-if.
- Используйте это так в вашем компоненте - "add_items" - ваше разрешение
<button type="button" v-can="'add_items'"></button>
Это решение от до , но вместо миксина я использую директиву.
Получил идею директивы из комментария @Ismoil Shifoev выше.