Die folgende von Laravel entwickelte Einführungs-Tutorial-Kolumne stellt Ihnen das magische Laravel-Makro (Makro) vor. Ich hoffe, es wird Freunden in Not hilfreich sein!
Wollten Sie schon immer eine Funktion in Laravel, aber es existierte nicht wirklich? Lassen Sie mich Ihnen Laravel-Makros vorstellen. Mit Makros können Sie benutzerdefinierte Funktionen zu den internen Komponenten von Laravel hinzufügen.
Nehmen wir als Beispiel eine einfache Request-Fassadenmethode.
Request::macro('introduce', function ($name) { echo 'Hello ' . $name . '!'; }); Request::introduce('Caleb'); // outputs "Hello Caleb!"
Ein praktischeres Request-Makro wird verwendet, um die aktuelle TLD (Top-Level-Domain: .com, .net, .org, .etc...) zu erkennen.
Request::macro('tldIs', function ($tld) { return Str::is('*.' . $tld, $this->root()); }); Request::tldIs('com') // returns true for app.com Request::tldIs('dev') // returns false for app.com
Sie werden feststellen, dass Laravel $this automatisch an den Kontext der Anfrage bindet und nicht an eine Klasse, die das Makro bereits definiert. Zum Beispiel:
class AppServiceProvider { public function boot() { Request::macro('context', function () { return get_class($this); } } ... Request::context(); // returns 'Illuminate\Http\Request' // instead of 'App\AppServiceProvider'
Schauen wir uns ein fortgeschritteneres Beispiel an. Dieses Makro fügt dem Modell basierend auf der aktuellen TLD bedingt eine where-Anweisung hinzu.
Builder::macro('whenTldMatches', function($tld, $callback) { if (Request::tldIs($tld)) { call_user_func($callback->bindTo($this)); } return $this; }); SomeModel::whenTldMatches('org', function () { $this->where('id', '>', 5); })->get(); // applies ->where() 在 app.org 上应用,而不在 app.com 上应用
Wo sollen wir sie definieren?
Dienstleister sind ein großartiger Ort, um Makros für Ihre Anwendung zu definieren. AppProvidersAppServiceProvider boot()
ist ein guter Injektionspunkt für I
, aber es kommt schnell zu Blähungen.
Der nächste Schritt besteht darin, ein AppProvidersMacrosServiceProvider
zu erstellen und es in config/app.php
zu registrieren. Wenn ein Makro damit verknüpft ist, erstelle ich möglicherweise ein AppProvidersTldAwareServiceProvider
, um alle mit TLD
verknüpften Makros aufzunehmen.
Welche Komponenten sind makrofähig?
Makros können für jede Klasse mit dem Macroable-Attribut definiert werden. Im Folgenden finden Sie eine Liste makrofähiger Fassaden und Klassen
Fassade
● Cache
● Datei
● Lang
● Anfrage
● Antwort
● Route
● URL
Illuminate-Klassen
● IlluminateCacheRepository
● IlluminateConsoleSchedulingEvent
● IlluminateDatabaseEloquentBuilder
● IlluminateDatabaseEloquentRelation
● IlluminateDatabaseQueryBuilder
●. IlluminateFilesystemFilesystem
● IlluminateFoundationTestingTestResponse
● IlluminateHttpRedirectResponse
● IlluminateHttpRequest
● IlluminateHttpUploadedFile
● IlluminateRoutingResponseFactory
● IlluminateRoutingRouter
● IlluminateRoutingUrlGenerator
● IlluminateSupportArr
● IlluminateSupportCollection
● IlluminateSupportStr
● IlluminateTranslationTranslator
● IlluminateValidationRule
Hands on
Wenn Sie feststellen, dass sich die Logik von Laravel-Komponenten in Ihrem gesamten System wiederholt, sollten Sie die Verwendung von Makros für einen besseren Ausdruck und eine bessere Wiederverwendung in Betracht ziehen. Glauben Sie mir, sehr gierig.
Viel Glück!
Weitere technische Artikel zum Laravel-Framework finden Sie im LaravelTutorial!
Das obige ist der detaillierte Inhalt vonLaravel-Makro. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!