La colonne tutorielle d'introduction suivante développée par Laravel vous présentera la macro magique Laravel (Macro).
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 tutorielCe 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!