最近、Laravel 7 で Universal Unique Identifier (UUID) を実装する必要があり、いくつかの問題に遭遇しました。この投稿が同じことをしている他の人に役立つことを願っています。
UUID を使用する高度な理由
A) UUID では、Uniform Resource Locator から番号付きの識別子が削除されるため、ユーザーは特定のオブジェクトの数を確認できません。アプリが作成しました。例:
https://myapp.com/api/users/5
コントラスト:
https://myapp.com/api/users/0892b118-856e-4a15-af0c-66a3a4a28eed
B) これらにより、識別番号を推測することがはるかに困難になります。これはセキュリティにとっては良いことですが、おそらくそれを防ぐために他の技術を実装する必要があります。
UUID を主キーとして実装する
データベース移行を変更する方法
まず、データベースの移行では、現在の自動インクリメント ID フィールドを UUID に置き換えたいと考えています。このアプローチに従うこともできます。自動インクリメント ID を保持し、ユーザーに URL が表示されるときに使用されるテーブル内の追加フィールドとして UUID を使用します (この場合、モデル内で ID を非表示にします)。私たちがここでできることではありません。仮想の従業員テーブルがどのようなものかを見てみましょう。
public function up() { Schema::create('employees', function (Blueprint $table) { $table->uuid('id')->primary; $table->string('name'); $table->string('email')->unique(); $table->string('work_location')->nullable(); $table->timestamps(); }); }
ここでは、通常の id() を uuid(); に置き換え、それを主キーにしていることに注目してください。
これを特性にしましょう
次に、Laravel ライフサイクル フックを実装して、このモデルの新しいインスタンスが作成されるときに UUID が割り当てられるようにします。モデルにコードを直接記述することもできますが、複数のモデルで UUID を使用する場合は、Traits を使用することをお勧めします (これについては、この開発記事で学びました。開発者に感謝します)。特性を使用すると、基本的に機能を作成し、それを use キーワード経由で呼び出して複数のモデルで使用できるようになります。
新しい Trait を作成するには、 \App\Http\Traits\ フォルダー (これは私の趣味です。他の場所に置いても構いません) を作成し、 Trait 用の新しいファイルを作成します。ファイルを UsesUuid.php と呼びます。
これは特性の特定のコードです:
<?php namespace App\Http\Traits; use Illuminate\Support\Str; trait UsesUuid { protected static function bootUsesUuid() { static::creating(function ($model) { if (! $model->getKey()) { $model->{$model->getKeyName()} = (string) Str::uuid(); } }); } public function getIncrementing() { return false; } public function getKeyType() { return 'string'; } }
\Illuminate\Support\Str を使用して UUID を簡単に生成します。 getIncrementing () メソッドは、モデルの主キーがインクリメントされないこと ( false に設定しているため) を Laravel に伝え、 getKeyType () メソッドは、モデルの主キーが文字列型であることを Laravel に伝えます。 bootUsesUuid() メソッドを使用すると、Laravel の強力なライフサイクル フックを使用できます。欧陽節の詳細については、こちらをご覧ください。基本的に、私たちのコードはすでに Laravel に、このモデルの新しいインスタンスが作成されるときに、それに UUID 主キーを設定するように指示しています。
use キーワードを使用して、この機能をモデルに簡単に実装できます。
<?php namespace App; use Illuminate\Database\Eloquent\Model; ... class Employee extends Model { ... use \App\Http\Traits\UsesUuid; ... }
UUID を外部キーとして参照
テーブル上の UUID を外部キーとして参照するには、テーブル上の外部キー フィールドのタイプを変更するだけです。 。次のように...
Schema::create('another_table', function(Blueprint $table) { $table->id(); $table->unsignedBigInteger('employee_id'); $table->string('some_field'); $table->foreign('employee_id') ->references('id') ->on('shifts') ->onDelete('cascade'); });
... 外部キーemployee_idを参照するときに符号なしの大きな整数データ型を作成し、それを次のように変更しました。
Schema::create('another_table', function(Blueprint $table) { $table->id(); $table->uuid('employee_id'); $table->string('some_field'); $table->foreign('employee_id') ->references('id') ->on('shifts') ->onDelete('cascade'); });
これは非常に簡単です。もう 1 つ...
UUID とポリモーフィックな関係
独自の操作またはインポートしているパッケージを通じて、ポリモーフィックな関係で参照していることに気づくかもしれません。モデル。移行では、テーブルは次のようになります。
public function up() { Schema::create('some_package_table', function (Blueprint $table) { $table->bigIncrements('id'); $table->morphs('model'); ... } }
ここで、morphs () メソッドは、データベースに 2 つのフィールド、符号なし整数型の model_id と文字列型の model_type を作成します。問題は、モデルが増分する整数 ID の代わりに UUID を使用していることです。そのため、次のようなエラーが表示されます。 :
Data truncated for column 'model_id' at row 1
新しい UUID をサポートするには、model_id フィールドが必要です。型はCHAR(36)です。心配しないで! Laravel を使用するとこれが非常に簡単になり、手動で行う必要がありません。移行を次のように変更するだけです:
public function up() { Schema::create('some_package_table', function (Blueprint $table) { $table->bigIncrements('id'); $table->uuidMorphs('model'); ... } }
Laravel を愛するもう 1 つの理由!コーディングを楽しんでください!
推奨チュートリアル: 「Laravel チュートリアル 」
以上がLaravel 7 で UUID を適切に使用するためのチュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。