


Entwerfen einer skalierbaren Repository-Struktur in Laravel mit queryFi
Einführung
Als ich ein neues Laravel-Projekt startete, fragte ich mich oft, welche Struktur ich verwenden sollte.
Laravel ist sehr gut strukturiert, verstehen Sie mich nicht falsch, es ist schwierig, Dinge durcheinander zu bringen.
Es gibt jedoch einen Haken: Wie vermeiden wir, die gesamte Logik, die wir benötigen, in einen Controller wie UserController.php zu packen?
In diesem Artikel konzentrieren wir uns auf dieses Problem. Ich werde meine bevorzugte Struktur zur Abdeckung meiner Anwendungsfälle zusammen mit einigen Best Practices teilen und erklären, wie queryFi integriert wird.
Erste Schritte
Da Sie hier sind, gehe ich davon aus, dass Sie bereits ein Laravel-Projekt haben oder wissen, wie man eines erstellt, sodass wir diesen Schritt überspringen können. Stellen Sie einfach sicher, dass die API eingerichtet ist.
Wir verwenden die folgende Struktur:
app ├── Repositories | ├── Interfaces | | ├── EloquentRepositoryInterface.php | └── Eloquent | ├── BaseRepository.php | └── UserRepository.php ├── Resources ├── BaseResource.php └── ExtendedJsonResource.php
Hier finden Sie den Ordner Ressourcen sowie einen benutzerdefinierten Logger.
1. Installieren Sie queryFi
# Backend composer require z3rka/queryfi # Frontend npm i queryfi
2. Repository-Schnittstellen hinzufügen
<?php namespace App\Repositories\Interfaces; use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Database\Eloquent\Model; use Illuminate\Http\Request; interface EloquentRepositoryInterface { public function create(array $attributes = [], ?string $successMessage, ?string $errorMessage): JsonResource; public function all(Request $request, ?string $errorMessage): JsonResource; public function one(Request $request, Model $model, ?string $errorMessage): JsonResource; public function update(Request $request, Model $model, ?string $successMessage, ?string $errorMessage): JsonResource; public function destroy(Request $request, ?string $successMessage, ?string $errorMessage): JsonResource; }
3. Fügen Sie die Basis-Repository-Klasse hinzu
Ich füge hier nur drei Methoden hinzu, um alles sauber zu halten und zu vermeiden, dass der Platz mit sich wiederholendem Code überfüllt wird.
Den Rest finden Sie hier.
<?php namespace App\Repositories\Eloquent; use Z3rka\Queryfi\HasRelations; class BaseRepository implements EloquentRepositoryInterface { use HasRelations; public function __construct(protected Model $model) { // } public function create(array $attributes = [], ?string $successMessage, ?string $errorMessage): BaseResource { try { return new BaseResource( true, $successMessage, $this->model->create($attributes) ); } catch (Exception $e) { return new BaseResource( false, $errorMessage, [ 'error' => $e ] ); } } public function all(Request $request, ?string $errorMessage): BaseResource { try { return new BaseResource( true, 'Success', $this->processModel($request, $this->model) ); } catch (Exception $e) { $this->spitError($e); return new BaseResource( false, "Fail", $this->model->get(), [ "error" => $e, ] ); } } public function one(Request $request, Model $model, ?string $errorMessage): BaseResource { try { return new BaseResource( true, "success", $this->processModel($request, $model) ) } catch (Exception $e) { $this->spitError($e); return new BaseResource( false, "Fail", $model, [ "error" => $e, ] ); } } }
Um etwas von einem Modell zurückzugeben, muss man normalerweise ->get() oder find und ->first() verwenden, das ist hier nicht der Fall, da wir das queryFi-Paket verwenden und wir können Folgendes tun:
$this->processModel($request, $this->model)
Dies deckt automatisch ->get() standardmäßig ab, wenn in der Abfrage kein Getter (überprüfen Sie die Getter hier) konfiguriert ist.
4. Benutzer-Repository
<?php namespace App\Repositories\Eloquent; use App\Models\User; use Z3rka\Queryfi\HasRelations; class UserRepository extends BaseRepository { use HasRelations; public function __construct(User $model) { parent::__construct($model); } }
5. Benutzercontroller
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Repositories\Eloquent\UserRepository; class UserController extends Controller { public function __construct(public UserRepository $userRepository) { } public function index(Request $request) { return $this->userRepository ->all($request, "Ooops, there was an error fetching all the users.") } public function show(Request $request, User $user) { return $this->userRepository->one( $request, $user, "Ooops, there was an error fetching the user." ); } }
6. Die API-Route
Route::resource('users', UserController::class)->only(['index', 'show'])
Sobald wir alles eingerichtet haben, können wir Anfragen vom Browser stellen, indem wir Abfrageparameter direkt übergeben, wie zum Beispiel:
url?where[name]=john&select=name&getter=first
Alternativ können wir für einen saubereren Ansatz das queryFi TypeScript-Paket im Frontend verwenden.
import { createQuery } from "queryfi"; const query = createQuery('/api/users', { baseUrl: "http://localhost:8000" }) .where({ id: 1 }) .first() // will return an object with the user if it exists.
Die generierte Abfrage sieht folgendermaßen aus:
http://localhost:8000/api/users?where[id]=1&getter=first
Dieser Codeteil gibt den Benutzer mit der ID = 1 zurück.
Wenn Sie .find() verwenden, ist die Antwort automatisch ein Objekt.
Wenn Sie .get() verwenden, wird ein Array zurückgegeben.
Sie können es auf dem Spielplatz ausprobieren, um zu sehen, wie die Reaktion aussieht.
Da wir das HasRelations-Merkmal verwenden, können wir Frontend-Abfragen verketten, um die Daten direkt im Backend umzuwandeln, bevor sie zurückgegeben werden, wie hier gezeigt.
import { createQuery } from "queryfi"; const query = createQuery('/api/users', { baseUrl: "http://localhost:8000" }) .where({ id: 1 }) .select(['email', 'id', 'name']) .get() // will return an array with one entry if it exists.
Weitere Methoden, die Sie verwenden können, finden Sie in der Dokumentation zu queryFi
ENDE
Und das ist es! ? Jetzt haben Sie einen soliden und leistungsstarken Ausgangspunkt, um Ihre APIs wie ein Profi zu erstellen.
Machen Sie weiter, lassen Sie Ihre Programmiermuskeln spielen und erschaffen Sie etwas Großartiges! ??
Kontaktieren Sie Github, Linkedin, queryFi
Das obige ist der detaillierte Inhalt vonEntwerfen einer skalierbaren Repository-Struktur in Laravel mit queryFi. 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 ...

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.

Senden von JSON -Daten mithilfe der Curl -Bibliothek von PHP in der PHP -Entwicklung müssen häufig mit externen APIs interagieren. Eine der gängigen Möglichkeiten besteht darin, die Curl Library zu verwenden, um Post � ...
