Spatie laravel / permission - изменение таблицы и методов

Я работаю с Laravel 5.6 и Spatie laravel-permission и хочу изменить model_has_roles, чтобы он может иметь дополнительное поле с именем code.

Теперь я сделал это, изменив миграции, предоставляемые библиотекой, с помощью следующей команды:

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"

В этой библиотеке есть полезная команда:

$user->assignRole($role);

Это позволяет мне назначать роль пользователю в одной строчке кода. Моя проблема в том, что использование этой команды вызовет ошибку, потому что я не могу оставить поле code пустым. В любом случае, я не могу сделать что-то вроде этого:

$user->assignRole($role, ['code' => '0001']);

Потому что он скажет, что 0001 is not a role. По сути, предполагается, что я пытаюсь назначить пользователю ДВЕ разные роли: $role и 0001, в то время как на самом деле я пытаюсь назначить одну роль: $role с дополнительным параметром для таблицы model_has_roles.

Есть ли способ заархивировать такое? Я подумал, что, возможно, смогу изменить логику метода assignRole, но я не знаю, как расширить / отредактировать методы библиотеки.


person Enrique Bermúdez    schedule 06.08.2018    source источник
comment
Вы не предоставляете нам достаточно информации о том, как вы работаете с новым столбцом с именем code, но вы можете установить его как допускающий значение NULL и его значение по умолчанию null. если это то, о чем вы спрашиваете, я напишу это как ответ   -  person MohamedSabil83    schedule 07.08.2018
comment
Я сказал, что не могу установить значение code для моих отношений пользователь / роль при использовании метода assignRole. Я не хочу, чтобы code было null по умолчанию: я хочу назначить роль И установить дополнительное поле для таблицы model_has_roles при этом.   -  person Enrique Bermúdez    schedule 07.08.2018
comment
Я думаю, что это делается в два этапа, если вы не вносите изменения в метод assignRole.   -  person MohamedSabil83    schedule 07.08.2018
comment
Но как я могу изменить метод assignRole или каковы эти два шага?   -  person Enrique Bermúdez    schedule 07.08.2018


Ответы (1)


Я вижу, что вы уже добавили столбец в миграцию, поэтому теперь вам нужно внести изменения в метод assignRole.

Пакет Spatie permission работает путем добавления свойства HasRoles в класс модели User.

Это полный путь черты -

use Spatie\Permission\Traits\HasRoles;

Чтобы добиться желаемого с помощью метода assignRole, вы можете просто скопировать контент из свойства HasRoles, а затем создать из этого кода свою собственную характеристику. Вы можете увидеть этот метод в этой характеристике -

    public function assignRole(...$roles)
    {
        $roles = collect($roles)
            ->flatten()
            ->map(function ($role) {
                if (empty($role)) {
                    return false;
                }

                return $this->getStoredRole($role);
            })
            ->filter(function ($role) {
                return $role instanceof Role;
            })
            ->each(function ($role) {
                $this->ensureModelSharesGuard($role);
            })
            ->map->id
            ->all();

        $model = $this->getModel();

        if ($model->exists) {
            $this->roles()->sync($roles, false);
            $model->load('roles');
        } else {
            $class = \get_class($model);

            $class::saved(
                function ($object) use ($roles, $model) {
                    static $modelLastFiredOn;
                    if ($modelLastFiredOn !== null && $modelLastFiredOn === $model) {
                        return;
                    }
                    $object->roles()->sync($roles, false);
                    $object->load('roles');
                    $modelLastFiredOn = $object;
                });
        }

        $this->forgetCachedPermissions();

        return $this;
    }

Внесите желаемые изменения в этот метод и используйте свойство custom вместо свойства HasRole пространства.

Кроме того, вы также можете переопределить метод из свойства HasRoles в своем классе, что является более простым и предпочтительным способом.

person Pankaj    schedule 28.02.2019