Как правильно реализовать UUID в Laravel с помощью spatie / laravel-Разрешения и webpatser / laravel-uuid? - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть приложение Laravel 5.7, использующее разрешение spatie / laravel и обычные идентификаторы для моделей.Я хочу перейти на использование UUID, и я предпринял шаги, упомянутые в файле Readme webpatser / laravel-uuid.Все работает с моими собственными моделями, например, с пользователем, моделью A, моделью B и т. Д., И отношения кажутся нормальными, но я не могу заставить работать uuid с разрешениями Spatie.

Когда я хочу назначить роль(и связанные разрешения) для объекта, я получаю следующую ошибку.Это происходит, когда я пытаюсь зарегистрировать пользователя и назначить ему роль.

As you can see in this image, the role_id from Spatie is transmitted into this query as an integer. Now it is 342, in other cases it is similar to 705293

Как вы можете видеть на этом рисунке, передается role_id из Spatieв этот запрос как целое число.Теперь это 342, в других случаях это похоже на 705293

Я определил черту Uuids.php в папке my / app соответственно и добавил для всех моделей, включая Permission.php и Role.php, следующиеcode:

public $incrementing = false;
protected $keyType = 'string';

use Uuids;

protected $casts = [
    'id' => 'string',
];

Я знаю, что это работает с любой другой моделью и отношением, но только не с разрешениями Spatie, и кажется, что role_id преобразуется по-разному во внутренних функциях (например, assignRole ('') изстроку из 36 символов в другое место. Если я запрашиваю роли или разрешения, я получаю правильный идентификатор строки.

Что-нибудь, что я могу пропустить или кто-нибудь знает, как исправить это?

Позже править: это моя первоначальная миграция для Spatie:

    <?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreatePermissionTables extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        $tableNames = config('permission.table_names');
        $columnNames = config('permission.column_names');

        Schema::create($tableNames['permissions'], function (Blueprint $table) {
            $table->uuid('id');
            $table->primary('id');
            $table->string('name');
            $table->string('guard_name');
            $table->timestamps();
        });

        Schema::create($tableNames['roles'], function (Blueprint $table) {
            $table->uuid('id');
            $table->primary('id');
            $table->string('name');
            $table->string('guard_name');
            $table->timestamps();
        });

        Schema::create($tableNames['model_has_permissions'], function (Blueprint $table) use ($tableNames, $columnNames) {
            $table->uuid('permission_id');
            $table->string('model_type');
            $table->uuid($columnNames['model_morph_key']);
            $table->index([$columnNames['model_morph_key'], 'model_type', ]);

            $table->foreign('permission_id')
                ->references('id')
                ->on($tableNames['permissions'])
                ->onDelete('cascade');

            $table->primary(
                ['permission_id', $columnNames['model_morph_key'], 'model_type'],
                    'model_has_permissions_permission_model_type_primary'
            );
        });

        Schema::create($tableNames['model_has_roles'], function (Blueprint $table) use ($tableNames, $columnNames) {
            $table->uuid('role_id');

            $table->string('model_type');
            $table->uuid($columnNames['model_morph_key']);
            $table->index([$columnNames['model_morph_key'], 'model_type', ]);

            $table->foreign('role_id')
                ->references('id')
                ->on($tableNames['roles'])
                ->onDelete('cascade');

            $table->primary(
                ['role_id', $columnNames['model_morph_key'], 'model_type'],
                    'model_has_roles_role_model_type_primary'
            );
        });

        Schema::create($tableNames['role_has_permissions'], function (Blueprint $table) use ($tableNames) {
            $table->uuid('permission_id');
            $table->uuid('role_id');

            $table->foreign('permission_id')
                ->references('id')
                ->on($tableNames['permissions'])
                ->onDelete('cascade');

            $table->foreign('role_id')
                ->references('id')
                ->on($tableNames['roles'])
                ->onDelete('cascade');

            $table->primary(['permission_id', 'role_id']);

            app('cache')->forget('spatie.permission.cache');
        });
    }

    //Reverse the migrations.
    public function down()
    {
        $tableNames = config('permission.table_names');

        Schema::drop($tableNames['role_has_permissions']);
        Schema::drop($tableNames['model_has_roles']);
        Schema::drop($tableNames['model_has_permissions']);
        Schema::drop($tableNames['roles']);
        Schema::drop($tableNames['permissions']);
    }
}

Это пример того, как хранятся (работают) роли и разрешения

enter image description here

То же самое относится и к разрешениям. Так что их _id верен. Проблема где-то в Laravel или в Spatie в том, что он отправляет другое значение в БД при попытке добавить роль в модель.

1 Ответ

0 голосов
/ 21 ноября 2018

Обновление таблиц в пакете не рекомендуется.Поэтому создайте признак в папке приложения:

<?php

namespace YourNamespace;

use Illuminate\Support\Str;

trait Uuids
{
    /**
    * Boot function from Laravel
    */
    protected static function boot()
    {
        parent::boot();

        static::creating(function ($model) {
            $model->incrementing = false;
            $model->{$model->getKeyName()} = Str::uuid()->toString();
        });
    }
}

Создайте миграцию для обновления структуры таблицы:

php artisan migrate:make change_primary_key_type_in_roles_table --table=roles

Добавьте в миграцию следующее:

public function up()
{
    Schema::table('roles', function (Blueprint $table) {
        $table->uuid('id')->change();
    });
}

public function down()
{
    Schema::table('roles', function (Blueprint $table) {
        $table->increments('id')->change();
    });
}

Используйте черту Uuid в вашей модели:

<?php

namespace YourNamespace;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    use Uuids;

    protected $guarded = [''];
    protected $casts = [
        'id' => 'string',
    ];

Затем выполните composer dumpautoload и php artisan migrate

...