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
/** * @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
<?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:
Hinweise
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!