Heim  >  Artikel  >  PHP-Framework  >  Laravel-Makro

Laravel-Makro

藏色散人
藏色散人nach vorne
2020-05-19 13:39:114230Durchsuche

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!

Laravel-Makro

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen