ホームページ > 記事 > PHPフレームワーク > モデルは ID を保持しながら UUID を外部に提供します。
アプリケーションによっては、ID を公開しないと、データベース内のモデルの数を他の人が簡単に知ることができなくなる場合があります。
翻訳者注: ID を非表示にすることで、ユーザーが Web サイトのコンテンツを悪意を持って閲覧することを効果的に防ぐこともできます。
ねえ、私のポッドキャスト アプリケーションでデフォルトの ID を設定していると想像してください。Laravel のポッドキャスト モデルでは、行が挿入されるたびに自動的に 1 ずつ増加する整数です。したがって、ID表の 47 番目の Podcast の は 47 です。次に、自分の Web サイト内で「このポッドキャスト アプリには何百万ものポッドキャストがあるので、お見逃しなく!」と主張しましたが、最新のポッドキャスト ID:
https://podcast.app/podcasts/47
Hide を見ると、これは簡単に誤りであることが判明しました。アプリ内のすべてを再配線せずに ID を取得し、見破られないことを望みますか?はい、方法はあります。
一部のデータベースは、新しい行を挿入するときに UUID を主キーとして設定するように構成できます。 RDBMS の実装はそれぞれ異なるため、使用している RDBMS でこれを確認する必要があります。
Eloqument イベントを使用して新しいレコードを作成するときにデフォルトの UUID を設定するようにアプリケーションに指示することもできますが、これにより、すべてのケースで Eloqument を使用することが強制されます。レコードをデータベースに直接挿入すると、エラーが発生する可能性があります。これが、私がアプリケーションではなくデータベースに自動 UUID を設定することを好む理由の 1 つです。これはデータベースの動作であるため、何も依存すべきではありません。 要約すると、Laravel を使用してデータベースを次のように設定する必要があります:
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreatePodcastTable extends Migration { /** * 运行数据库迁移 * * @return void */ public function up() { Schema::create('podcast', function (Blueprint $table) { $table->bigIncrements('id'); $table->uuid('uuid')->index(); $table->string('filename'); $table->string('path'); $table->string('service'); $table->string('format', 4); $table->unsginedTinyInteger('quality', 4); $table->timestamps(); $table->timestamps(); $table->softDeletes(); }); } /** * 回滚数据库迁移 * * @return void */ public function down() { Schema::dropIfExists('podcast'); } }
ご覧のとおり、
$table->uuid('uuid')- > を追加しました。 ;索引()###。このコードは、Laravel に UUID 列 (サポートされている場合は文字列列を使用) を使用し、この列にインデックスを作成するように指示します。これにより、誰かがこの URL にアクセスした場合と同じように、UUID によって行を迅速に取得できるようになります。 :https://podcast.app/podcast/535c4cdf-70a0-4615-82f2-443e95c86aec
別のインデックスが挿入操作を妨げるという主張もできますが、それはトレードオフです。
さて、問題はコントローラーとモデルにあります。 モデルを UUID に接続するモデルでは、シリアル化から ID を非表示にすることと、モデルが「URL ルーティング」に UUID を使用できるようにすること以外は何もする必要はありません。 <?php namespace App; use Illuminate\Database\Eloquent\Model; class Podcast extends Model { /** * 数组中隐藏的属性 * * @var array */ protected $hidden = [ 'id' ]; /** * 获取模型的路由键 * * @return string */ public function getRouteKeyName() { return 'uuid'; } // ……其余的模型代码 }
id
列を追加します。モデルが配列や JSON 文字列に変換されるなどシリアル化されている場合、ID は表示されません。もちろん、プロパティや配列キーと同様に、取得したプロパティのIDにアクセスすることもできます。次のステップは、URL にモデルの UUID が含まれている場合、
uuid
Route::get({podcast}, 'PodcastController@show');
のようなルートを設定し、それを
PodcastController クラス内で使用することでモデルを検索できるようになります。 /** * 通过 UUID 显示播客 * * @param \App\Podcast $podcast * @return \Illuminate\Http\Response /* public function show(Podcast $podcast) { return response()->view('response', [ 'podcast' => $podcast ]); }
指定された値でモデルを取得する方法をプログラムで設定できる場合は、モデルでsolveRouteBinding() メソッドを使用することもできます。認証された管理者が ID または UUID に基づいてレコードを取得できるようにすることもできます。
以上、他にやることはありません。このテクノロジーにより、アプリケーションの構築後に UUID を
設定することもできます。
Laravel 関連の技術記事の詳細については、Laravel チュートリアル 列にアクセスして学習してください。
以上がモデルは ID を保持しながら UUID を外部に提供します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。