下面由Laravel開發入門教學專欄為大家介紹神奇的 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 巨集指令(Macro)的詳細內容。更多資訊請關注PHP中文網其他相關文章!