Laravel - Contracts: A Beginner's Guide
Hallo那里,未来的 Laravel 巫师们!今天,我们将踏上一段激动人心的旅程,探索 Laravel Contracts 的世界。如果你是编程新手,不用担心——我将作为你的友好向导,我们会一步一步来。在本教程结束时,你将牢固地理解 Contracts 是什么,以及它们如何使你的 Laravel 应用程序更加灵活和强大。
Was sind Laravel Contracts?
Stellen Sie sich vor, Sie bauen eine riesige Lego-Konstruktion. Wäre es nicht großartig, wenn Sie bestimmte Teile problemlos auswechseln könnten, ohne dass das ganze Gebilde auseinanderfällt? Genau das ermöglichen uns Laravel Contracts mit unserem Code!
In technischer Hinsicht sind Laravel Contracts ein Satz von Schnittstellen, die die von dem Framework bereitgestellten Kernservices definieren. Sie dienen als "Vertrag" zwischen Ihnen und dem Framework, der sicherstellt, dass bestimmte Methoden immer verfügbar sind, unabhängig von der spezifischen Implementierung.
Warum Contracts verwenden?
- Flexibilität: Contracts erleichtern den Austausch von Anwendungskomponenten.
- Klarheit: Sie bieten eine klare und prägnante API für die Funktionen des Frameworks.
- Testbarkeit: Contracts machen es einfacher, Unit-Tests für Ihren Code zu schreiben.
Lassen Sie uns mit einigen Beispielen tiefer einsteigen!
Dein erster Contract: Cache
Einer der am häufigsten verwendeten Contracts in Laravel ist der Cache Contract. Sehen wir uns an, wie wir ihn verwenden könnten:
use Illuminate\Contracts\Cache\Repository as Cache;
class UserController
{
protected $cache;
public function __construct(Cache $cache)
{
$this->cache = $cache;
}
public function showProfile($id)
{
$user = $this->cache->remember('user.'.$id, 3600, function() use ($id) {
return User::find($id);
});
return view('user.profile', ['user' => $user]);
}
}
In diesem Beispiel verwenden wir den Cache Contract, um Benutzerdaten zu speichern und abzurufen. Lassen Sie uns das aufschlüsseln:
- Wir importieren den Cache Contract mit
use Illuminate\Contracts\Cache\Repository as Cache;
- Im Konstruktor injizieren wir eine Instanz des Cache Contract.
- In der
showProfile
-Methode verwenden wir dieremember
-Methode, um den Benutzer entweder aus dem Cache abzurufen oder, falls er nicht existiert, aus der Datenbank abzurufen und ihn für eine Stunde (3600 Sekunden) im Cache zu speichern.
Der Clou beim Einsatz des Contract besteht darin, dass wir uns nicht um die spezifische Caching-Implementierung kümmern müssen. Es könnte Redis, Memcached oder sogar dateibasiertes Caching sein – unser Code bleibt gleich!
Die Macht der Abhängigkeitsinjektion
Vielleicht haben Sie bemerkt, dass wir die Cache-Instanz nicht selbst erstellt haben. Stattdessen haben wir sie im Konstruktor angefordert. Dies wird Abhängigkeitsinjektion genannt und ist ein Schlüsselkonzept in Laravel.
Wenn Laravel eine Instanz unseres UserController erstellt, bemerkt es, dass wir im Konstruktor einen Cache anfordern. Laravel sucht dann heraus, welche konkrete Implementierung es für den Cache Contract verwenden soll und stellt sie automatisch unserer Kontrolle zur Verfügung.
Dies macht unseren Code flexibler und einfacher zu testen. Wir könnten die Cache-Implementierung in unseren Tests problemlos austauschen, ohne die Kontrollercode zu ändern!
Häufig verwendete Laravel Contracts
Laravel bietet viele Contracts aus der Box. Hier sind einige der am häufigsten verwendeten:
Contract | Beschreibung |
---|---|
Cache | Bietet Methoden zum Cachen von Daten |
Queue | Ermöglicht die Delegation zeitaufwändiger Aufgaben |
Auth | Handhabt Authentifizierung und Autorisierung |
Bietet Methoden zum Senden von E-Mails | |
Filesystem | Bietet eine einheitliche API für die Arbeit mit lokalen und cloudbasierten Dateispeichern |
Erstellung eigener Contracts
Wenn Sie sich zunehmend wohl mit Laravel fühlen, möchten Sie möglicherweise eigene Contracts erstellen. Lassen Sie uns ein einfaches Beispiel für einen hypothetischen Wetterdienst erstellen:
// app/Contracts/WeatherService.php
namespace App\Contracts;
interface WeatherService
{
public function getCurrentTemperature(string $city): float;
public function getForecast(string $city, int $days): array;
}
Jetzt können wir eine Implementierung dieses Contract erstellen:
// app/Services/OpenWeatherMapService.php
namespace App\Services;
use App\Contracts\WeatherService;
class OpenWeatherMapService implements WeatherService
{
public function getCurrentTemperature(string $city): float
{
// Implementierung mit OpenWeatherMap API
}
public function getForecast(string $city, int $days): array
{
// Implementierung mit OpenWeatherMap API
}
}
Um dies in unserer Anwendung zu verwenden, binden wir unsere Implementierung an den Contract in einem ServiceProvider:
// app/Providers/AppServiceProvider.php
use App\Contracts\WeatherService;
use App\Services\OpenWeatherMapService;
public function register()
{
$this->app->bind(WeatherService::class, OpenWeatherMapService::class);
}
Überall in unserer Anwendung, wo wir Wetterdaten benötigen, können wir einfach den WeatherService Contract typisieren:
use App\Contracts\WeatherService;
class WeatherController
{
protected $weather;
public function __construct(WeatherService $weather)
{
$this->weather = $weather;
}
public function index(Request $request)
{
$temperature = $this->weather->getCurrentTemperature($request->city);
return view('weather', ['temperature' => $temperature]);
}
}
Der Vorteil dieses Ansatzes besteht darin, dass wir, wenn wir später beschließen, zu einem anderen Wetter-API zu wechseln, nur eine neue Implementierung erstellen und unseren ServiceProvider aktualisieren müssen. Der Rest unseres Anwendungscodes bleibt unverändert!
Fazit
Glückwunsch! Sie haben Ihre ersten Schritte in die Welt der Laravel Contracts unternommen. Wir haben was Contracts sind, warum sie nützlich sind und wie man sie in Ihren Laravel-Anwendungen verwendet, behandelt. Wir haben sogar unseren eigenen Contract und seine Implementierung erstellt!
Denken Sie daran, Contracts dienen dazu, eine klare API für Ihre Anwendungskomponenten zu definieren. Sie machen Ihren Code flexibler, leichter zu verstehen und einfacher zu testen. Während Sie Ihre Laravel-Reise fortsetzen, werden Sie immer mehr Möglichkeiten finden, Contracts zu nutzen, um robuste und wartbare Anwendungen zu erstellen.
Weiters üben, neugierig bleiben, und bald werden Sie ein Profi in Laravel Contracts sein! Frohes Coden!
Credits: Image by storyset