Почему `использование черты` в другой черте приводит к ошибке совместимости? (Laravel 7, Laravel разрешения) - PullRequest
0 голосов
/ 25 марта 2020

Я использую 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 из пользовательских классов, используются оригинальные черты и код работает.

Может ли кто-нибудь помочь мне объяснить мне, что я делаю неправильно? Это также заставляет меня сомневаться в том, что это лучший подход к достижению моей цели, поэтому предложения по лучшим решениям также приветствуются!

...