ホームページ > PHPフレームワーク > Laravel > モデルは ID を保持しながら UUID を外部に提供します。

モデルは ID を保持しながら UUID を外部に提供します。

步履不停
リリース: 2019-07-03 17:57:32
オリジナル
2366 人が閲覧しました

モデルは 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(&#39;podcast&#39;, 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 = [
        &#39;id&#39;
    ];

    /**
     * 获取模型的路由键
     *
     * @return string
     */
    public function getRouteKeyName()
    {
        return &#39;uuid&#39;;
    }

    // ……其余的模型代码
}
ログイン後にコピー

ID を非表示にするには、非表示のプロパティ配列に

id

列を追加します。モデルが配列や JSON 文字列に変換されるなどシリアル化されている場合、ID は表示されません。もちろん、プロパティや配列キーと同様に、取得したプロパティのIDにアクセスすることもできます。

次のステップは、URL にモデルの UUID が含まれている場合、uuid

列を通じてモデルを取得するように Laravel に指示することです。これにより、

Route::get({podcast}, &#39;PodcastController@show&#39;);
ログイン後にコピー
のようなルートを設定し、それを 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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート