Laravelマクロ

藏色散人
藏色散人転載
2020-05-19 13:39:114268ブラウズ

以下は Laravel が開発したものです 入門チュートリアルコラムでは、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 サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。