Laravelマクロ

藏色散人
リリース: 2020-05-19 13:39:11
転載
4281 人が閲覧しました

以下は 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 までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート