首頁 >php框架 >Laravel >Laravel 巨集指令(Macro)

Laravel 巨集指令(Macro)

藏色散人
藏色散人轉載
2020-05-19 13:39:114276瀏覽

下面由Laravel開發入門教學專欄為大家介紹神奇的 Laravel 巨集指令(Macro),希望對需要的朋友有幫助!

Laravel 巨集指令(Macro)

可曾有過想要的一項功能在 Laravel 中,但它又不是真實存在的?讓我來跟你介紹一下 Laravel 巨集指令。巨集指令允許你加入自訂功能到 Laravel 的內部元件裡去。

讓我們以一個簡單的 Request 門面方法為例。

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

一個更實用的 Request 巨集指令是用來偵測目前的 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 到 Request 的上線文中,而不是在一個已經定義巨集的類別裡。例如:

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 特性的類別。下面是一個Macroable 的門面和類別的清單

門面

#● Cache

● File

● Lang

● Request

● Response

● Route

● URL

Illuminate Classes

#● Illuminate\Cache\Repository

● Illuminate\Console\Scheduling\Event

● Illuminate\Database\Eloquent\Builder

● Illuminate\Database\Eloquent\Builder

● Illuminate\Database\Eloent\Relation#quent\Relation

##● Illuminate\Database\Query\Builder

● Illuminate\Filesystem\Filesystem

● Illuminate\Foundation\Testing\TestResponse

 Illuminate\Foundation\Testing\TestResponse

合適

##● Illuminate\Http\Request

● Illuminate\Http\UploadedFile

● Illuminate\Routing\ResponseFactory

"●Illuminate\Routing\ResponseFactory

●Illuminate\Routing

#● Illuminate\Routing\UrlGenerator

● Illuminate\Support\Arr

● Illuminate\Support\Collection

● Illuminate\Support\Str

# #● Illuminate\Translation\Translator

● Illuminate\Validation\Rule

動手

如果您發現自己在整個系統中對Laravel 元件重複執行邏輯,請考慮使用巨集以實現更好的表達和重複使用。相信我,非常饞。

祝您好運! 更多laravel框架技術文章,請造訪

laravel#######教學! ###

以上是Laravel 巨集指令(Macro)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:learnku.com。如有侵權,請聯絡admin@php.cn刪除