Dieser Artikel führt Sie hauptsächlich in ein tiefgreifendes Verständnis der Kernarchitektur von Laravel 5.5 ein. Der Artikel stellt sie anhand von Bildern, Texten und Beispielcodes ausführlich vor Editor.
1. Die Abhängigkeitsinjektionsmethode
übergibt den Komponentennamen und das Framework wird automatisch instanziiert.
kann beispielsweise direkt verwendet werden , das am häufigsten verwendete Anforderungsobjekt
2. Der Kern von Laravel ist tatsächlich ein IoC-Container Sehr leichtgewichtig, und es gibt nichts Magisches oder Wesentliches an den Anwendungsfunktionen. Verschiedene von vielen Menschen verwendete Funktionsmodule wie Route (Routing), Eloquent ORM (Datenbank-ORM-Komponente), Request (Anfrage), Response (Antwort) usw. werden tatsächlich von Klassenmodulen bereitgestellt, die nichts mit dem Kern zu tun haben Der Prozess von der Registrierung über die Instanziierung dieser Klassen bis hin zur endgültigen Verwendung durch Sie liegt tatsächlich in der Verantwortung des Service-Containers von Laravel.
Der Dienstanbieter ist hauptsächlich in zwei Teile unterteilt: Registrieren (Registrierung) und Booten (Booten, Initialisierung)
3 Dienstanbieter
Eine Klasse muss Eigentum des sein Container Um extrahieren zu können, müssen Sie sich zunächst für diesen Container registrieren. Da Laravel diesen Container einen Service-Container nennt, müssen wir, wenn wir einen Service benötigen, zuerst den Service registrieren und an den Container binden. Dann ist das Ding, das den Service bereitstellt und den Service an den Container bindet, der Service-Provider.
4. Fügen Sie Ihre eigene Klasse zum IOC-Container hinzu
4.1 Erstellen Sie eine neue Validierungsklasse
4.2
4.3. Binden Sie die Validierungsklasse an den Provider
4.4. Provider zum IOC-Container hinzufügen<?php namespace App\Providers; use Illuminate\Support\ServiceProvider; class ValidateProvider extends ServiceProvider { /** * Bootstrap the application services. * * @return void */ public function boot() { // } /** * Register the application services. * * @return void */ public function register() { $this->app->bind('valicate',function(){ return new Validate(); }); } }
4.5, verwenden Sie
4.6, Erfolg!
5. Fassade
Fassade wird verwendet, um eine einheitliche Schnittstelle bereitzustellen, unabhängig davon, welchen Cache Sie verwenden, Redis oder Memcache Sie können die Methode „cache::get()“ verwenden, um den Wert abzurufen. Ob Sie Redis oder Memcahe verwenden, hängt davon ab, welche Methode Sie im Dienstanbieter gebunden haben. Die Implementierung von cache::get() besteht darin, die Facade-Methode getFacadeAccessor zu erben und den Schlüsselwert zurückzugeben, den Sie in den Container binden, z. B. den Cache. Dann verwendet die Facade-Klasse die PHP-Magievariable __callstatic() aus dem Container stammen. Analysieren Sie den an den Cache gebundenen Dienst, an den der zuvor erwähnte Dienstanbieter gebunden ist
5.1, zum Beispiel per E-Mail in config/app.php
5.2. Diese Klasse gibt nur einen Mailer zurück
5.3 Wenn ihre Sendemethode aufgerufen wird, wird sie in die Callstatic eingegeben magische Methode
5.4 Diese Methode ruft die Instanz von Mailer ab, also app('mailer')
5.5. Diese Instanz kann die Sendemethode der Mailer-Klasse aufrufen
6. Vertrag
Laravel's Vertrag ist eine Reihe von Schnittstellen, die die vom Framework bereitgestellten Kerndienste definieren. Beispielsweise definiert der IlluminateContractsQueueQueue-Vertrag die Methoden, die zum Einreihen von Aufgaben in die Warteschlange erforderlich sind, während der IlluminateContractsMailMailer-Vertrag die Methoden definiert, die zum Senden von E-Mails erforderlich sind. Das Framework stellt für jeden Vertrag entsprechende Implementierungen bereit.
Der Vorteil besteht darin, dass eine geringe Kopplung und Einfachheit des Programms erreicht wird.
Niedrige Kopplung#
Schauen wir uns zunächst etwas Code für die Cache-Implementierung mit hoher Kopplung an. Wie folgt:
In dieser Klasse ist das Programm stark mit dem angegebenen Cache gekoppelt. Weil wir auf eine bestimmte Caching-Klasse aus einem Erweiterungspaket angewiesen sind. Sobald die API dieser Erweiterung geändert wird, muss sich unser Code entsprechend ändern.<?php namespace App\Orders; class Repository { /** * 缓存实例。 */ protected $cache; /** * 创建一个仓库实例。 * * @param \SomePackage\Cache\Memcached $cache * @return void */ public function __construct(\SomePackage\Cache\Memcached $cache) { $this->cache = $cache; } /** * 按照 Id 检索订单 * * @param int $id * @return Order */ public function find($id) { if ($this->cache->has($id)) { // } } }
Wenn wir die zugrunde liegende Caching-Technologie (Memcached) durch eine andere Caching-Technologie (Redis) ersetzen möchten, müssen wir die Repository-Klasse ebenfalls erneut ändern. Die Repository-Klasse sollte nicht zu viel darüber wissen, wer die Daten bereitgestellt hat oder wie sie bereitgestellt wurden usw.
Im Vergleich zum obigen Ansatz können wir eine einfache, vom Erweiterungspaket unabhängige Schnittstelle verwenden, um unseren Code zu verbessern:
<?php namespace App\Orders; use Illuminate\Contracts\Cache\Repository as Cache; class Repository { /** * 缓存实例。 */ protected $cache; /** * 创建一个仓库实例。 * * @param Cache $cache * @return void */ public function __construct(Cache $cache) { $this->cache = $cache; } }
现在,更改之后的代码没有与任何扩展包甚至是 Laravel 耦合。而契约扩展包不包含任何实现和依赖项,你可以轻松地写任何给定契约的替代实现,来实现不修改任何关于缓存消耗的代码就可以替换缓存实现。
相关推荐:
Laravel 5.5中为响应请求提供的可响应接口详解_php实例
Das obige ist der detaillierte Inhalt vonDetaillierte Erklärung der Laravel 5.5-Kernarchitektur. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!