PHP FRACTAL - Machen Sie Ihre API immer hübsch!
Dieser Artikel wurde von Viraj Khatavkar überprüft. Vielen Dank an alle Peer -Rezensenten von SitePoint, um SitePoint -Inhalte in den Besten zu bringen!
Wenn Sie die API zuvor erstellt haben, werden Sie es gewohnt, die Daten direkt als Antwort auszugeben. Dies ist möglicherweise nicht schädlich, wenn es richtig gemacht wird, aber es gibt einige praktische Alternativen, die dazu beitragen können, dieses Problem zu lösen.
Eine der verfügbaren Lösungen ist fraktal. Es ermöglicht uns, eine neue Transformationsschicht für das Modell zu erstellen, bevor wir das Modell als Antwort zurückgeben. Es ist sehr flexibel und einfach in jede Anwendung oder ein Rahmen integrieren.
Schlüsselpunkte
- PHP Fractal ist eine Lösung, mit der Entwickler neue Transformationsschichten für ihre Modelle erstellen können, bevor sie als Antworten zurückgegeben werden, wodurch JSON -Daten leichter zu verwalten und konsistent zu werden.
- fraktal ist flexibel und einfach in jede Anwendung oder ein Rahmen zu integrieren. Es wird mit Transformator verwendet, um komplexe Datenstrukturen in einfachere Formate umzuwandeln und Serializer zu verwenden, um die endgültige Ausgabe zu formatieren.
- Fractal ermöglicht auch die Einbeziehung von Unterressourcen (Beziehungen) in die Antwort, wenn sie vom Benutzer angefordert werden, und fügen Sie die Datenwiedergabe eine weitere Ebene der Flexibilität und Steuerung hinzu.
- Die Verwendung von Fractal kann die Abfrageleistung optimieren, indem sie gleichzeitig Beziehungen laden, wodurch die N 1 -Probleme gelöst werden, auf die eloquentes faule Laden häufig begegnet ist.
Installation
Wir werden die Laravel 5.3 -Anwendung verwenden, um das Beispiel zu erstellen und das fraktale Paket damit zu integrieren. Verwenden Sie also das Installationsprogramm oder erstellen Sie eine neue Laravel -Anwendung über Komponisten.
<code>laravel new demo</code>
oder
<code>composer create-project laravel/laravel demo</code>
Dann brauchen wir im Ordner das fraktale Paket.
<code>composer require league/fractal</code>
Erstellen Sie eine Datenbank
Unsere Datenbank enthält Benutzer und Rollentabellen. Jeder Benutzer hat eine Rolle und jede Rolle hat eine Berechtigungsliste.
// app/User.php class User extends Authenticatable { protected $fillable = [ 'name', 'email', 'password', 'role_id', ]; protected $hidden = [ 'password', 'remember_token', ]; /** * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function role() { return $this->belongsTo(Role::class); } }
// app/Role.php class Role extends Model { protected $fillable = [ 'name', 'slug', 'permissions' ]; /** * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function users() { return $this->hasMany(User::class); } }
erstellen Transformator
Wir werden für jedes Modell einen Transformator erstellen. Unsere UserTransformer -Klasse sieht folgendermaßen aus:
// app/Transformers/UserTransformer.php namespace App\Transformers; use App\User; use League\Fractal\TransformerAbstract; class UserTransformer extends TransformerAbstract { public function transform(User $user) { return [ 'name' => $user->name, 'email' => $user->email ]; } }
Ja, ein Transformator zu erstellen ist so einfach! Es konvertiert nur Daten auf eine Weise, die Entwickler verwalten können, und überlassen Sie sie nicht dem ORM oder dem Repository.
Wir erweitern die Transformerabstract -Klasse und definieren die Transformationsmethode, die mithilfe der Benutzerinstanz aufgerufen wird. Gleiches gilt für die Roletransformer -Klasse.
namespace App\Transformers; use App\Role; use League\Fractal\TransformerAbstract; class RoleTransformer extends TransformerAbstract { public function transform(Role $role) { return [ 'name' => $role->name, 'slug' => $role->slug, 'permissions' => $role->permissions ]; } }
Erstellen Sie einen Controller
Unsere Controller sollten Daten konvertieren, bevor sie sie an den Benutzer senden. Wir werden nun die Benutzercontroller -Klasse abwickeln und nur den Index und die Anzeigenoperationen vorübergehend definieren.
// app/Http/Controllers/UsersController.php class UsersController extends Controller { /** * @var Manager */ private $fractal; /** * @var UserTransformer */ private $userTransformer; function __construct(Manager $fractal, UserTransformer $userTransformer) { $this->fractal = $fractal; $this->userTransformer = $userTransformer; } public function index(Request $request) { $users = User::all(); // 从数据库获取用户 $users = new Collection($users, $this->userTransformer); // 创建资源集合转换器 $users = $this->fractal->createData($users); // 转换数据 return $users->toArray(); // 获取转换后的数据数组 } }
{ "data": [ { "name": "Nyasia Keeling", "email": "crooks.maurice@example.net" }, { "name": "Laron Olson", "email": "helen55@example.com" }, { "name": "Prof. Fanny Dach III", "email": "edgardo13@example.net" }, { "name": "Athena Olson Sr.", "email": "halvorson.jules@example.com" } // ... ] }
Pagination
Laravel neigt dazu, Dinge zu vereinfachen. Wir können Paginierung wie folgt umsetzen:
<code>laravel new demo</code>
Aber damit dies mit Fractal funktioniert, müssen wir möglicherweise einen Code hinzufügen, um die Daten zu konvertieren und dann den Pager aufzurufen.
<code>composer create-project laravel/laravel demo</code>
Der erste Schritt besteht darin, die Daten aus dem Modell zu paginieren. Als nächstes erstellen wir wie zuvor eine Ressourcensammlung und richten dann einen Pager in der Sammlung ein.
Fractal liefert Laravel einen Paginatoradapter, um die LängeAwarepaginator -Klasse zu konvertieren, die auch einen Adapter für Symfony und Zend bietet.
<code>composer require league/fractal</code>
Beachten Sie, dass es den Paging -Details zusätzliche Felder hinzufügt. Sie können mehr über Paging in der Dokumentation lesen.
enthält Unter-Ressourcen
Jetzt, da wir mit Fractal vertraut sind, ist es an der Zeit zu lernen, wie man SubResources (Beziehungen) in die Antwort einbezieht, wenn ein Benutzer anfordert.
Wir können anfordern, zusätzliche Ressourcen in die Antwort einzubeziehen, z. B. http://demo.vaprobash.dev/users?include=role. Unser Konverter kann automatisch erkennen, was angefordert wird, und den Parameter einschließen.
// app/User.php class User extends Authenticatable { protected $fillable = [ 'name', 'email', 'password', 'role_id', ]; protected $hidden = [ 'password', 'remember_token', ]; /** * @return \Illuminate\Database\Eloquent\Relations\BelongsTo */ public function role() { return $this->belongsTo(Role::class); } }
$ verfügbar includes gibt dem Konverter mit, dass wir möglicherweise einige zusätzliche Daten in die Antwort einbeziehen müssen. Wenn der Parameter des Include -Abfrage die Benutzerrolle anfordert, wird die Includeerole -Methode aufgerufen.
// app/Role.php class Role extends Model { protected $fillable = [ 'name', 'slug', 'permissions' ]; /** * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function users() { return $this->hasMany(User::class); } }
$ this- & gt; fractal- & gt; Parzeincludes-Linie ist für die Parsen verantwortlich, einschließlich Abfrageparameter. Wenn wir eine Liste von Benutzern anfordern, sollten wir so etwas sehen:
// app/Transformers/UserTransformer.php namespace App\Transformers; use App\User; use League\Fractal\TransformerAbstract; class UserTransformer extends TransformerAbstract { public function transform(User $user) { return [ 'name' => $user->name, 'email' => $user->email ]; } }
Wenn jeder Benutzer eine Rollenliste hat, können wir den Konverter in so etwas ändern:
namespace App\Transformers; use App\Role; use League\Fractal\TransformerAbstract; class RoleTransformer extends TransformerAbstract { public function transform(Role $role) { return [ 'name' => $role->name, 'slug' => $role->slug, 'permissions' => $role->permissions ]; } }
SubResources enthält, können wir Punktnotation verwenden, um Beziehungen zu nisten. Angenommen, jede Rolle hat eine Liste von Berechtigungen, die in einer separaten Tabelle gespeichert sind, und wir möchten Benutzer mit ihren Rollen und Berechtigungen auflisten. Wir können tun = rollen.Permissions.
Manchmal müssen wir standardmäßig einige notwendige Assoziationen einbeziehen, z. B. Adressverbände. Wir können dies tun, indem wir die Eigenschaft $ defaultIncludes im Konverter verwenden.
// app/Http/Controllers/UsersController.php class UsersController extends Controller { /** * @var Manager */ private $fractal; /** * @var UserTransformer */ private $userTransformer; function __construct(Manager $fractal, UserTransformer $userTransformer) { $this->fractal = $fractal; $this->userTransformer = $userTransformer; } public function index(Request $request) { $users = User::all(); // 从数据库获取用户 $users = new Collection($users, $this->userTransformer); // 创建资源集合转换器 $users = $this->fractal->createData($users); // 转换数据 return $users->toArray(); // 获取转换后的数据数组 } }
{ "data": [ { "name": "Nyasia Keeling", "email": "crooks.maurice@example.net" }, { "name": "Laron Olson", "email": "helen55@example.com" }, { "name": "Prof. Fanny Dach III", "email": "edgardo13@example.net" }, { "name": "Athena Olson Sr.", "email": "halvorson.jules@example.com" } // ... ] }
Wir können jetzt die enthaltenen Benutzerlisten sortieren, indem wir Parameter (/Rollen? Include = Benutzer: Order (Name | ASC))) sortieren. Weitere Informationen zur Einbeziehung von Ressourcen in die Dokumentation.
Aber was passiert, wenn der Benutzer keine zugeordneten Rollen hat? Es stoppt und es wird ein Fehler angezeigt, da es gültige Daten anstelle von Null erwartet. Lassen Sie uns die Beziehung aus der Antwort entfernen, anstatt ihren Nullwert anzuzeigen.
<code>laravel new demo</code>
Notfallbelastung
Da eloquent verzögert wird, das Modell beim Zugriff zu beladen, können wir auf n 1 Probleme stoßen. Dies kann durch eine einmalige Ladebeziehung gelöst werden, um Abfragen zu optimieren.
<code>composer create-project laravel/laravel demo</code>
Auf diese Weise werden wir beim Zugriff auf die Modellbeziehung keine zusätzlichen Fragen haben.
Schlussfolgerung
Ich bin auf Fractal gestoßen, als ich "Aufbau einer API, die Sie nicht hassen" von Phil Sturgeon gelesen habe, einer großartigen und informativen Lektüre, die ich nur empfehle.
Haben Sie beim Erstellen Ihrer API einen Konverter verwendet? Haben Sie ein bevorzugtes Paket, das die gleiche Arbeit erledigt, oder verwenden Sie nur json_encode? Bitte teilen Sie uns im Kommentarbereich unten mit!
php fraktale FAQ
Was ist PHP fraktal und warum ist es wichtig?
php fractal ist ein leistungsstarkes Tool, das dazu beiträgt, Daten für die API zu rendern und zu transformieren. Dies ist wichtig, da es eine standardisierte Möglichkeit bietet, komplexe, verschachtelte Datenstrukturen auszugeben, um sicherzustellen, dass die Datenausgabe der API konsistent, gut strukturiert und leicht zu verstehen ist. Dies erleichtert Entwicklern, Ihre API zu verwenden, und verringert die Möglichkeit von Fehlern.
Wie funktioniert PHP fraktal?
PHP-Fraktalarbeiten, indem sie komplexe Datenstrukturen aufnehmen und in einfachere zu bedienende Formate umwandeln. Es wird über zwei Hauptkomponenten implementiert: Transformator und Serializer. Transformator ist für die Konvertierung komplexer Daten in einfachere Formate verantwortlich, während Serializer die endgültige Ausgabe formatiert.
Was ist Transformator in PHP -Fraktal?
Der Transformator in PHP -Fraktal ist eine Klasse, die definiert, wie Anwendungsdaten in der API -Antwort ausgegeben werden sollten. Sie nehmen komplexe Datenstrukturen auf und konvertieren sie in einfachere und einfachere Verwendung von Formaten. Auf diese Weise können Sie genau steuern, welche Daten in der API -Antwort enthalten sind und wie sie strukturiert sind.
Was ist Serializer in PHP -Fraktal?
Serializer in PHP -Fraktal ist für die Formatierung der endgültigen Ausgabe der API verantwortlich. Sie nehmen die Daten, die von Transformator konvertiert wurden, und formatieren sie in eine bestimmte Struktur. Auf diese Weise können Sie sicherstellen, dass die Ausgabe der API konsistent und leicht zu verstehen ist.
Wie implementiere ich PHP -Fraktal in meinem Projekt?
Implementieren von PHP -Fraktal in einem Projekt beinhaltet die Installation der fraktalen Bibliothek über den Komponisten, das Erstellen eines Transformators für die Daten und die Verwendung der fraktalen Klasse, um die Daten mithilfe von Transformator zu transformieren. Sie können dann einen der Serialisierer von Fractal verwenden, um die konvertierten Daten auszugeben.
Kann ich PHP -Fraktal mit einem PHP -Projekt verwenden?
Ja, PHP FRACTAL ist eine eigenständige Bibliothek, die mit jedem PHP -Projekt verwendet werden kann. Es stützt sich nicht auf ein bestimmtes Framework oder eine bestimmte Plattform, was es zu einem universellen Werkzeug für einen PHP -Entwickler macht.
Was sind die Vorteile der Verwendung von PHP -Fraktal?
Die Verwendung von PHP -Fraktal bietet viele Vorteile. Es stellt sicher, dass die Ausgabe der API konsistent und gut strukturiert ist, was es den Entwicklern erleichtert. Es bietet auch eine standardisierte Möglichkeit, komplexe Datenstrukturen zu transformieren, die Möglichkeit von Fehlern zu verringern und den Code zu erhalten.
Wie vergleicht PHP Fractal mit anderen Datenkonvertierungstools?
php fraktal fällt aus seiner Einfachheit und Flexibilität auf. Es bietet eine einfache Möglichkeit, komplexe Datenstrukturen zu transformieren, und ermöglicht eine hohe Anpassung mit Transformator und Serializer. Dies macht es zu einem leistungsstarken Werkzeug für jeden Entwickler, der APIs verwendet.
Kann ich die Ausgabe von PHP fraktal anpassen?
Ja, PHP FRACTAL ist sehr anpassbar. Sie können benutzerdefinierte Transformatoren erstellen, um genau zu steuern, wie Ihre Daten konvertiert werden, und die Ausgabe auf unterschiedliche Weise mit verschiedenen Serialisierern formatieren. Auf diese Weise können Sie die Ausgabe Ihrer API an Ihre spezifischen Anforderungen anpassen.
Wo kann ich mehr über PHP -Fraktal erfahren?
Es gibt viele Ressourcen, mit denen Sie mehr über PHP -Fraktal erfahren können. Die offizielle PHP League -Website bietet umfassende Dokumentation und es gibt viele Tutorials und Blog -Beiträge online. Darüber hinaus ist das PHP Fractal Github Repository ein großartiger Ort, um den Code zu untersuchen und Beispiele für die Verwendung zu sehen.
Das obige ist der detaillierte Inhalt vonPHP FRACTAL - Machen Sie Ihre API immer hübsch!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Alipay PHP ...

JWT ist ein offener Standard, der auf JSON basiert und zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird, hauptsächlich für die Identitätsauthentifizierung und den Informationsaustausch. 1. JWT besteht aus drei Teilen: Header, Nutzlast und Signatur. 2. Das Arbeitsprinzip von JWT enthält drei Schritte: Generierung von JWT, Überprüfung von JWT und Parsingnayload. 3. Bei Verwendung von JWT zur Authentifizierung in PHP kann JWT generiert und überprüft werden, und die Funktionen und Berechtigungsinformationen der Benutzer können in die erweiterte Verwendung aufgenommen werden. 4. Häufige Fehler sind Signaturüberprüfungsfehler, Token -Ablauf und übergroße Nutzlast. Zu Debugging -Fähigkeiten gehört die Verwendung von Debugging -Tools und Protokollierung. 5. Leistungsoptimierung und Best Practices umfassen die Verwendung geeigneter Signaturalgorithmen, das Einstellen von Gültigkeitsperioden angemessen.

Die Hijacking der Sitzung kann in den folgenden Schritten erreicht werden: 1. Erhalten Sie die Sitzungs -ID, 2. Verwenden Sie die Sitzungs -ID, 3. Halten Sie die Sitzung aktiv. Zu den Methoden zur Verhinderung der Sitzung der Sitzung in PHP gehören: 1. Verwenden Sie die Funktion Session_regenerate_id (), um die Sitzungs -ID zu regenerieren. 2. Store -Sitzungsdaten über die Datenbank, 3. Stellen Sie sicher, dass alle Sitzungsdaten über HTTPS übertragen werden.

Die Anwendung des soliden Prinzips in der PHP -Entwicklung umfasst: 1. Prinzip der Einzelverantwortung (SRP): Jede Klasse ist nur für eine Funktion verantwortlich. 2. Open and Close Principle (OCP): Änderungen werden eher durch Erweiterung als durch Modifikation erreicht. 3.. Lischs Substitutionsprinzip (LSP): Unterklassen können Basisklassen ersetzen, ohne die Programmgenauigkeit zu beeinträchtigen. 4. Schnittstellen-Isolationsprinzip (ISP): Verwenden Sie feinkörnige Schnittstellen, um Abhängigkeiten und nicht verwendete Methoden zu vermeiden. 5. Abhängigkeitsinversionsprinzip (DIP): Hoch- und niedrige Module beruhen auf der Abstraktion und werden durch Abhängigkeitsinjektion implementiert.

Wie debugge ich den CLI -Modus in PhpStorm? Bei der Entwicklung mit PHPSTORM müssen wir manchmal den PHP im CLI -Modus (COMS -Zeilenschnittstellen) debuggen ...

In Artikel werden wichtige Sicherheitsfunktionen in Frameworks erörtert, um vor Schwachstellen zu schützen, einschließlich Eingabevalidierung, Authentifizierung und regelmäßigen Aktualisierungen.

So setzen Sie die Berechtigungen von Unixsocket automatisch nach dem Neustart des Systems. Jedes Mal, wenn das System neu startet, müssen wir den folgenden Befehl ausführen, um die Berechtigungen von Unixsocket: sudo ...

Statische Bindung (statisch: :) implementiert die späte statische Bindung (LSB) in PHP, sodass das Aufrufen von Klassen in statischen Kontexten anstatt Klassen zu definieren. 1) Der Analyseprozess wird zur Laufzeit durchgeführt.
