Heim >PHP-Framework >Laravel >Erfahren Sie, wie Laravel automatisch lange ganzzahlige Schneeflocken-IDs in Zeichenfolgen umwandelt

Erfahren Sie, wie Laravel automatisch lange ganzzahlige Schneeflocken-IDs in Zeichenfolgen umwandelt

藏色散人
藏色散人nach vorne
2020-11-03 15:06:072800Durchsuche

wird Laravel die Methode zur automatischen Umwandlung langer und integrierter Schneeflocken in eine Schnur vorstellen. Ich hoffe, dass sie Freunden, die sie benötigen, hilfreich sein wird! Beim Entwerfen einer API ist es aus Sicherheitsgründen manchmal erforderlich, auf die Verwendung automatisch inkrementierender IDs zu verzichten, um die IDs nicht kontinuierlich und nicht erraten zu machen. Dies kann normalerweise mithilfe von Hash-ID, UUID, Snowflake-ID usw. erreicht werden. In einem aktuellen Projekt habe ich versucht, Snowflake ID zu verwenden. Nach langem Herumtüfteln habe ich festgestellt, dass die Leistung recht hoch und die Implementierung recht einfach ist. Als ich jedoch weiter die Ärmel hochkrempelte und mich mit dem Front-End-Teil verband, gab es ein Problem mit dem JS-Präzisionsverlust, da die gespeicherte ID ein vorzeichenloser Bigint-Wert war. (Warum es zu einem Genauigkeitsverlust kommt, werde ich hier nicht im Detail erklären. Wenn Sie sich nicht sicher sind, können Sie selbst danach suchen.) In diesem Artikel werden hauptsächlich Lösungen vorgestellt.

Um dieses Problem zu lösen, ist das Grundprinzip sehr einfach: Konvertieren Sie die ID in eine Zeichenfolge und geben Sie sie dann an das Frontend zurück.

Schlechter Versuch

Zuerst dachte ich daran, den Modell-Accessor des Laravel Eloquent-Modells zu verwenden. Fügen Sie dem zu konvertierenden Modell einfach ein getIdAttribute hinzu und konvertieren Sie die ID in eine Zeichenfolge, oder? Zum Beispiel: Das AppModelsUser-Modell schreibt:

/**

 * @return string

 */public function getIdAttribute(){

    return strval($this->attributes['id']);}

Aber das ist nicht der Fall. Der Attribut-Accessor kann tatsächlich dafür sorgen, dass die von der API an das Frontend zurückgegebene ID zu einer Zeichenfolge wird. Es wirkt sich jedoch auch auf die Ergebnisse des Einfügens und Änderns des zugehörigen Modells aus. Wenn der Benutzer beispielsweise mit dem Beitragsmodell verknüpft ist, verwenden Sie $user->posts()->saveMany(…); Auf diese Weise ist die entsprechende user_id leer.

Das ist nicht schwer zu verstehen, da der Modell-Accessor an der modellbezogenen Verarbeitung teilnehmen muss. Der Accessor wandelt die ID von einer Zahl in eine Zeichenfolge um, was natürlich zu Datenverwirrung führt.

Richtige Haltung

Beruhigen Sie sich und überlegen Sie sorgfältig, bevor Sie Maßnahmen ergreifen. Nachdem ich die offizielle Dokumentation überprüft hatte, stellte ich fest, dass Resource genau das ist, was ich will. Die Ressource wirkt sich nur auf die an das Frontend zurückgegebenen Daten aus. Wir können die Ressource anpassen, um die Struktur, die Typkonvertierung und andere Funktionen der API-Rückgabeergebnisse zu implementieren. Es ist einfach, IDs zu ändern. Um Ärger zu vermeiden, ändere ich die AppHttpResource-Basisklasse direkt. Überladen Sie einfach die toArray()-Methode, verwenden Sie darin Rekursion und konvertieren Sie Werte, die den sicheren numerischen Bereich von JS überschreiten können. Sie können je nach Ihrer tatsächlichen Situation auch eine neue Ressourcenklasse erstellen, z. B. UserResource.

<?php

namespace App\Http\Resources;

use Illuminate\Http\Resources\Json\JsonResource;

class Resource extends JsonResource
{
    /**
     * Transform the resource into an array.
     *
     * @param \Illuminate\Http\Request $request
     *
     * @return array
     */
    public function toArray($request)
    {
        $parentReturn = parent::toArray($request);

        foreach (array_keys($parentReturn) as $key) {
            // 为方便演示这里把所有整型字段都转成字符串
            if (is_int($parentReturn[$key])) {
                $parentReturn[$key] = strval($parentReturn[$key]);
            }

            // 关联的字段,如 $user->post,相当于递归处理
            if (is_array($parentReturn[$key])) {
                $parentReturn[$key] = new Resource($parentReturn[$key]);
            }
        }

        return $parentReturn;
    }
}

Dann geben Sie die Ressource im Schnittstellencontroller zurück, um Daten zurückzugeben, und der ganzzahlige Feldwert wird automatisch zu einer Zeichenfolge.

<?php

namespace App\Http\Controllers;

use App\Http\Resources\Resource;

use App\Models\User;

use Illuminate\Http\Request;

class TestController extends Controller
{
    /**
     * @return \App\Http\Resources\Resource
     */
    public function __invoke(Request $request)
    {
        $user = User::first();
        return new Resource($user);
    }
}

Das Ergebnis ist wie folgt:


Laravel 自动转换长整型雪花 ID 为字符串Hinweise

Da diese Methode Traversierung und rekursive Verarbeitung verwendet, kann es bei komplexer Datenstruktur und Datenmenge zu gewissen Auswirkungen auf die Leistung kommen groß. Ich denke, das ist eine faule und knifflige Schreibweise. Wenn Sie Leistung anstreben, wäre es besser, die Ressourcenklasse anzupassen und sie dann basierend auf bestimmten bekannten Feldnamen zu konvertieren, da die ID an das Frontend zurückgegeben wird Bei der Konvertierung in eine Zeichenfolge sollte dem Frontend besondere Aufmerksamkeit gewidmet werden, insbesondere bei === Urteilen

Das obige ist der detaillierte Inhalt vonErfahren Sie, wie Laravel automatisch lange ganzzahlige Schneeflocken-IDs in Zeichenfolgen umwandelt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen