Heim  >  Artikel  >  PHP-Framework  >  Das Modell stellt der Außenwelt die UUID zur Verfügung und behält dabei die ID bei.

Das Modell stellt der Außenwelt die UUID zur Verfügung und behält dabei die ID bei.

步履不停
步履不停Original
2019-07-03 14:54:222328Durchsuche

Das Modell stellt der Außenwelt die UUID zur Verfügung und behält dabei die ID bei.

In einigen Anwendungen kann die Nichtoffenlegung der ID dazu führen, dass andere die Anzahl der Modelle in Ihrer Datenbank nicht leicht erkennen können.

Anmerkung des Übersetzers: Durch das Verstecken der ID kann Benutzer auch effektiv daran gehindert werden, den Inhalt der Website böswillig zu durchsuchen.

Hey, stellen Sie sich vor, ich habe in meiner Podcast-Anwendung eine Standard-ID festgelegt. Im Podcast-Modell von Laravel handelt es sich um eine Ganzzahl, die jedes Mal, wenn eine Zeile eingefügt wird, automatisch um eins erhöht wird. Daher ist die ID von Der 47. Podcast in der Tabelle ist 47. Ich habe dann auf meiner Website behauptet: „Diese Podcast-App hat Millionen von Podcasts, also verpassen Sie sie nicht! “, was leicht entlarvt wurde, als ich die neueste Podcast-ID sah:

https://podcast.app/podcasts/47

Verstecken die ID, ohne alles in der App neu verbinden zu müssen und hoffen, nicht durchschaut zu werden? Okay, es gibt einen Weg.

Einrichten der Datenbank

Einige Datenbanken können so konfiguriert werden, dass beim Einfügen neuer Zeilen eine UUID als Primärschlüssel festgelegt wird. Sie sollten dies auf dem von Ihnen verwendeten RDBMS überprüfen, da jede RDBMS-Implementierung anders ist.

Sie können die Anwendung auch anweisen, die Standard-UUID festzulegen, wenn Sie neue Datensätze von Eloqument-Ereignissen erstellen, indem Sie verwenden. Dadurch werden Sie jedoch gezwungen, Eloqument in allen Fällen zu verwenden. Wenn Sie einen Datensatz direkt in die Datenbank einfügen, erhalten Sie möglicherweise eine Fehlermeldung. Dies ist einer der Gründe, warum ich die automatische UUID lieber in der Datenbank als in der Anwendung festlege. Dies sollte von nichts abhängen, da dies das Datenbankverhalten ist.

Zusammenfassend sollten Sie Ihre Datenbank mit Laravel wie folgt einrichten:

<?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');
    }
}

Wie Sie sehen können, haben wir $table->uuid('uuid')->index() hinzugefügt. Dieser Code weist Laravel an, die UUID-Spalte zu verwenden (oder eine Zeichenfolgenspalte zu verwenden, falls unterstützt) und einen Index für diese Spalte zu erstellen, damit Zeilen schnell per UUID abgerufen werden können, genau wie jemand es tun würde, wenn er diese URL besucht:

https://podcast.app/podcast/535c4cdf-70a0-4615-82f2-443e95c86aec

Man könnte argumentieren, dass ein anderer Index Einfügevorgänge behindern würde, aber das ist ein Kompromiss.

Das Problem liegt nun beim Controller und dem Modell.

Verbinden Sie das Modell mit der UUID

Sie müssen im Modell nichts tun, außer zwei Dingen: die ID vor der Serialisierung verbergen und dem Modell erlauben, die UUID für „URL-Routing“ zu verwenden " .

<?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;;
    }

    // ……其余的模型代码
}

Um die ID auszublenden, können wir die Spalte id zum Array der ausgeblendeten Eigenschaften hinzufügen. Wenn das Modell serialisiert wird, beispielsweise in ein Array oder eine JSON-Zeichenfolge konvertiert wird, wird die ID nicht angezeigt. Natürlich können Sie auch auf die ID der erhaltenen Eigenschaft zugreifen, genau wie auf eine Eigenschaft oder einen Array-Schlüssel.

Der nächste Schritt besteht darin, Laravel mitzuteilen, dass das Modell über die Spalte uuid abgerufen werden soll, wenn die URL die UUID des Modells enthält. Dadurch kann das Modell nachgeschlagen werden, indem eine Route wie

Route::get({podcast}, &#39;PodcastController@show&#39;);

eingerichtet und dann innerhalb unserer PodcastController-Klasse verwendet wird.

/**
 * 通过 UUID 显示播客
 *
 * @param  \App\Podcast $podcast
 * @return \Illuminate\Http\Response
/* 
public function show(Podcast $podcast)
{
    return response()->view('response', [
        'podcast' => $podcast
    ]);
}

Sie können auch die Methode „resolveRouteBinding()“ im Modell verwenden, wenn Sie programmgesteuert festlegen können, wie das Modell anhand eines bestimmten Werts abgerufen werden soll. Sie können authentifizierten Administratoren sogar erlauben, Datensätze basierend auf ihrer ID oder UUID abzurufen.

Das war's, es gibt nichts mehr zu tun. Diese Technologie ermöglicht auch die Festlegung der UUID nachdem die Anwendung generiert wurde.

Weitere technische Artikel zu Laravel finden Sie in der Spalte Laravel-Tutorial, um mehr darüber zu erfahren!

Das obige ist der detaillierte Inhalt vonDas Modell stellt der Außenwelt die UUID zur Verfügung und behält dabei die ID bei.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn