Maison  >  Article  >  cadre php  >  MacroLaravel

MacroLaravel

藏色散人
藏色散人avant
2020-05-19 13:39:114151parcourir

La colonne tutorielle d'introduction suivante développée par Laravel vous présentera la macro magique Laravel (Macro).

MacroLaravel

Avez-vous déjà voulu une fonctionnalité dans Laravel, mais elle n'existait pas vraiment ? Laissez-moi vous présenter les macros Laravel. Les macros vous permettent d'ajouter des fonctionnalités personnalisées aux composants internes de Laravel.

Prenons comme exemple une simple méthode de façade de requête.

Request::macro('introduce', function ($name) {
    echo 'Hello ' . $name . '!';
});
Request::introduce('Caleb'); // outputs "Hello Caleb!"

Une macro Request plus pratique est utilisée pour détecter le TLD actuel (domaine de premier niveau : .com, .net, .org, .etc...).

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

Vous remarquerez que Laravel lie automatiquement $this au contexte de la requête, plutôt qu'à une classe qui définit déjà la macro. Par exemple :

class AppServiceProvider
{
    public function boot()
    {
        Request::macro('context', function () {
            return get_class($this);
        }
    }
...
Request::context(); 
// returns 'Illuminate\Http\Request'
// instead of 'App\AppServiceProvider'

Regardons un exemple plus avancé. Cette macro ajoute conditionnellement une instruction Where sur le modèle basé sur le TLD actuel.

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 上应用

Où doit-on les définir ?

Les fournisseurs de services sont un excellent endroit pour définir des macros pour votre application. AppProvidersAppServiceProvider boot() est un bon point d'injection pour I , mais il gonfle rapidement.

L'étape suivante consiste à créer un AppProvidersMacrosServiceProvider et à l'enregistrer dans config/app.php. Si une macro y est liée, je pourrais créer un AppProvidersTldAwareServiceProvider pour contenir toutes les macros liées à TLD .

Quels composants sont macroables ?

Les macros peuvent être définies sur n'importe quelle classe avec l'attribut Macroable. Ce qui suit est une liste de façades et de classes macroables

Façade

● Cache

● Fichier

● Lang

● Demande

● Réponse

● Itinéraire

● URL

Classes éclairées

gi IlluminateCacheRepository

● IlluminateConsoleSchedulingEvent

● IlluminateDatabaseEloquentBuilder

● IlluminateDatabaseEloquentRelation

● IlluminateDatabaseQueryBuilder

weight IlluminateFilesystemFilesystem

● IlluminateFoundationTestingTestResponse

● IlluminateHttpRedirectResponse

● IlluminateHttpRequest

● IlluminateHttpUploadedFile

● IlluminateRoutingResponseFactory

● Illu minateRoutingRouter

● IlluminateRoutingUrlGenerator

● IlluminateSupportArr

● IlluminateSupportCollection

● IlluminateSupportStr

● IlluminateTranslationTranslator

● IlluminateValidationRule

Pratique

Si vous vous retrouvez à répéter la logique sur les composants Laravel dans tout votre système, pensez à utiliser des macros pour une meilleure expression et réutilisation. Croyez-moi, très gourmand.

Bonne chance !

Pour plus d'articles techniques sur le framework Laravel, veuillez visiter le tutoriel

laravel !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer