Я использую Spatie Permission
для своих разрешений в Laravel и мне нужно добавить дополнительные логи c для некоторых методов, таких как hasPermissionTo()
и syncPermissions
. Я не хочу сами модифицировать библиотеку spatie Permission
, поэтому я решил сделать своего рода обертку для библиотеки. Для этого я создал в настоящее время 2 класса и 2 черты, такие как:
<?php
namespace App\PermissionWrapper;
use Illuminate\Database\Eloquent\Model;
use \App\PermissionWrapper;
class Role extends \Spatie\Permission\Models\Role
{
use HasPermissionsWrapper;
}
<?php
namespace App\PermissionWrapper;
use Illuminate\Support\Facades\Log;
use Spatie\Permission\Contracts\Permission as PermissionContract;
class Permission extends \Spatie\Permission\Models\Permission
{
use HasRolesWrapper;
}
<?php
namespace App\PermissionWrapper;
trait HasPermissionsWrapper // I Chose this name instead of HasPermissions so i'm sure that its not a namespace/duplicate name issue
{
use \Spatie\Permission\Traits\HasPermissions;
}
<?php
namespace App\PermissionWrapper;
use Illuminate\Support\Facades\Log;
trait HasRolesWrapper
{
use \Spatie\Permission\Traits\HasRoles;
}
Идея состоит в том, что я переопределяю методы (из исходных черт и классов), которые нуждаются в дополнительных logi c, а остальное наследуется непосредственно из библиотеки. Я хочу добавить дополнительные логи c непосредственно в признак (не в пользовательских классах, использующих этот признак), когда это возможно, чтобы избежать дублирования кода в случае, если мне нужно переопределить другие классы из Spatie Permission
, которые используют тот же черты).
Но когда я попробую это в tinker User::find(2)->hasPermissionTo('testPermission')
я получил ошибку PHP Fatal error: Declaration of App\PermissionWrapper\HasPermissionsWrapper::permissions(): Illuminate\Database\Eloquent\Relations\MorphToMany must be compatible with Spatie\Permission\Models\Role::permissions(): Illuminate\Database\Eloquent\Relations\BelongsToMany in /var/www/festipay.xlan/app/PermissionWrapper/Role.php on line 8
Я не понимаю ошибку, так как, по моим мыслям, logi c все еще точно так же, как оригинальная библиотека, поскольку я наследую только вещи. Когда я удаляю use customTrait
из пользовательских классов, используются оригинальные черты и код работает.
Может ли кто-нибудь помочь мне объяснить мне, что я делаю неправильно? Это также заставляет меня сомневаться в том, что это лучший подход к достижению моей цели, поэтому предложения по лучшим решениям также приветствуются!