以下は Laravel が開発したものです 入門チュートリアルコラムでは、Laravel の魔法のマクロ命令 (マクロ) を紹介します。
Laravel に欲しい機能があったのに、実際には存在しなかったという経験はありませんか? Laravelのマクロを紹介します。マクロを使用すると、Laravel の内部コンポーネントにカスタム機能を追加できます。
単純な Request ファサード メソッドを例として取り上げます。
Request::macro('introduce', function ($name) { echo 'Hello ' . $name . '!'; }); Request::introduce('Caleb'); // outputs "Hello Caleb!"
より実用的なリクエスト マクロは、現在の TLD (トップレベル ドメイン: .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
Laravel は、マクロを定義したクラスではなく、リクエストのコンテキストに $this を自動的にバインドすることに気づくでしょう。例:
class AppServiceProvider { public function boot() { Request::macro('context', function () { return get_class($this); } } ... Request::context(); // returns 'Illuminate\Http\Request' // instead of 'App\AppServiceProvider'
より高度な例を見てみましょう。このマクロは、現在の TLD に基づいてモデルに where ステートメントを条件付きで追加します。
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 上应用
どこで定義すればよいでしょうか?
サービス プロバイダーは、アプリケーションのマクロを定義するのに最適な場所です。 App\Providers\AppServiceProvider boot()
は I
に適した注入ポイントですが、すぐに肥大化します。
次のステップでは、App\Providers\MacrosServiceProvider
を作成し、config/app.php
に登録します。マクロが関連する場合は、App\Providers\TldAwareServiceProvider
を作成して、すべての TLD
関連マクロを保持します。
どのコンポーネントがマクロ可能ですか?
マクロは、Macroable 属性を持つ任意のクラスで定義できます。以下は、Macroable のファサードとクラスのリストです。
Facade
● Cache
#● File
#● Lang
# リクエスト
# ● レスポンス
# ルート
# URL
##クラスを照らす #● Illuminate\Cache\Repository
● Illuminate\Console\Scheduling\Event
● Illuminate\Database\Eloquent\Builder
● Illuminate\Database\Eloquent\Relation
# Illuminate\Database\Query\Builder
## Illuminate\Filesystem\Filesystem## Illuminate\Foundation\Testing\TestResponse
## Illuminate\Http\RedirectResponse● Illuminate\Http\Request##● Illuminate\Http\UploadedFile
##● Illuminate\Routing\ResponseFactory##● Illuminate\Routing\Router
# Illuminate\Routing\UrlGenerator
● Illuminate\Support\Arr
● Illuminate\Support\Collection
● Illuminate\Support\Str
● Illuminate\Translation\Translator
#● Illuminate\Validation\Ruleハンズオン
システム全体で Laravel コンポーネントが重複していることに気付いた場合ロジックを実行するには、より適切な表現と再利用のためにマクロの使用を検討してください。信じてください、とても貪欲です。 ######幸運を! laravel フレームワークの技術記事については、laravelチュートリアルをご覧ください。
以上がLaravelマクロの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。