Laravel 宏指令(Macro)動態添加自定義方法到Laravel的核心組件中

Laravel 宏指令(Macro)

在Laravel中,宏指令(Macro)是一種靈活的方式,允許您動態添加自定義方法到Laravel的核心組件中,如模型、查詢構建器、集合等,以便在不改變核心代碼的情況下擴展框架的功能。通過宏指令,您可以向Laravel內置的類添加自定義方法,實現更高級的功能和邏輯。

福利彩蛋:沒有好玩的 API 接口?上百款免費接口等你來,免費 API,免費 API 大全

模型中定義宏指令使用示例

1. 在模型中定義宏指令

您可以在模型中定義宏指令,讓模型具備額外的功能。以下是一個示例,展示如何向模型添加一個自定義的宏指令:

use Illuminate\Database\Eloquent\Model;Model::macro('customMethod', function() {// 定義自定義方法邏輯return 'This is a custom method.';
});

2. 在查詢構建器中定義宏指令

您也可以在查詢構建器中定義宏指令,以便在查詢數據時使用自定義的方法。以下是一個示例,展示如何向查詢構建器添加一個自定義的宏指令:

use Illuminate\Database\Query\Builder;Builder::macro('whereActive', function () {return $this->where('active', '=', 1);
});

3. 使用宏指令

在定義宏指令后,您可以通過具體的對象來調用宏指令定義的方法。例如,在模型中調用上面定義的 customMethod 宏指令:

$user = User::find(1);
echo $user->customMethod(); // 輸出:This is a custom method.

或者在查詢構建器中使用上面定義的 whereActive 宏指令:

$activeUsers = DB::table('users')->whereActive()->get();

使用宏指令可以方便地為Laravel項目添加自定義方法,提高代碼復用性和擴展性。同時,宏指令的靈活性使您可以根據具體需求動態地為不同的類添加自定義方法,擴展框架功能,提升開發效率。

高級使用

一、前置準備:

安裝 tutorigo/laravel-ide-macros


composer require tutorigo/laravel-ide-macrosphp artisan vendor:publish --provider="Tutorigo\LaravelMacroHelper\IdeMacrosServiceProvider"php artisan ide-helper:macros

二、開始使用

1、新建MacrosServiceProvider或根據業務擴展需求創建RouteMacrosServiceProvider等等
2、config/app.php中添加MacrosServiceProvider注冊
3、在MacrosServiceProvider boot中完成宏指令編寫

1、Route macro 來定義 Route 的新方法permission

通過宏指令綁定自定義方法到路由實例
路由定義時候通過宏指令自定義的方法將響應的參數存儲到路由action參數下,該參數在路由緩存的時候回一并緩存

/*** 擴展路由方法*/
Route::macro('permission', function (array $value): self {$this->action['permission'] = $value;return $this;
});Route::macro('getPermission', function (): array {return $this->action['permission'] ?? [];
});/**
* 路由定義
*/
Route::post('report', 'ProductController@apiReport')->permission(['value' => 'productPayReport', 'name' => '付費數據統計', 'label' => '付費API統計']);/**
* 權限中間件或其他地方使用
*/
$permission = request()->getPermission()

2、Route macro 來定義 Route 的新方法full

通過新增的方法可以簡潔的定義兩個路由

Route::macro('full',function ($prefix, $controller){Route::delete($prefix.'/destroy-selection', $controller.'@destroySelection')->name($prefix.'destroy-selection');Route::apiResource($prefix, $controller);
});/**
* 路由定義:一次完成兩個路由定義
*/
Route::full('prefix','UserController')

3、擴展數據查詢builder新方法

輸出完整的sql語句

// 查詢構造器builder
// use Illuminate\Database\Query\Builder as QBuilder;
QBuilder::macro('toRawSql', function () {return array_reduce($this->getBindings(), function ($sql, $binding) {return preg_replace('/\?/', is_numeric($binding) ? $binding : "'" . $binding . "'", $sql, 1);}, $this->toSql());});// 數據庫模型builder      
// use Illuminate\Database\Eloquent\Builder as EBuilder;
EBuilder::macro('toRawSql', function () {return ($this->getQuery()->toRawSql());
});// 使用,輸出查詢語句:
var_dump(SomeModel::where('id',1)->toRawSql())// 自定義一個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();

3、Request 宏指令用于檢測當前的 TLD(頂級域:.com,.net,.org,.etc…)

use Illuminate\Support\Facades\Request;// 定義
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

4、Response響應宏

use Illuminate\Support\Facades\Response;
// 注冊成功響應宏
Response::macro('success', function ($data = [], $message = 'success') {return new JsonResponse(['code' => 0,'data' => $data,'message' => $message], 200);
});// 調用
return response()->success($userRepository->all(), 'success');

福利彩蛋:沒有好玩的 API 接口?上百款免費接口等你來,免費 API,免費 API 大全

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/41611.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/41611.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/41611.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

電腦硬盤分區的基本步驟(2個實用的硬盤分區方法)

在現代計算機中,硬盤分區是非常重要的一步。無論是新硬盤的初始化,還是重新組織現有硬盤,分區都是必不可少的操作。本文將詳細介紹電腦硬盤分區的基本步驟,幫助您更好地管理和利用硬盤空間。 文章開始,我們先簡單說一…

【C++】 解決 C++ 語言報錯:Invalid Conversion from ‘const char*’ to ‘char*’

文章目錄 引言 在 C 編程中,類型轉換錯誤(Invalid Conversion)是常見的編譯錯誤之一。特別是當程序試圖將一個常量字符指針(const char*)轉換為非常量字符指針(char*)時,會導致編譯…

Vmware環境下ESXi主機 配置上行鏈路、虛擬交換機、端口組、VMkernel網卡

一、適用場景 1、使用專業服務器跑多種不同的業務,每種業務可能所需運行的server環境不同,有的需要Linux server CentOS7/8、kali、unbuntu……有的需要windows server2008、2003、2016、2019、2022…… 2、本例采用的是VMware ESXi6.7 update 3版本&am…

力扣習題--找不同

目錄 前言 題目和解析 1、找不同 2、 思路和解析 總結 前言 本系列的所有習題均來自于力扣網站LeetBook - 力扣(LeetCode)全球極客摯愛的技術成長平臺 題目和解析 1、找不同 給定兩個字符串 s 和 t ,它們只包含小寫字母。 字符串 t…

Java Maven中自動代碼檢查插件詳細介紹

文章目錄 Checkstyle主要特點使用場景配置與使用checkstyle.xmlsuppressions.xml 驗證打包時驗證執行命令驗證 Spotless配置文件內容Java配置部分POM 配置部分Markdown 配置部分Up to Date Checking執行部分 驗證打包時驗證在插件中執行命令驗證 Checkstyle Spotless 結合chec…

ABAP中BAPI_CURRENCY_CONV_TO_INTERNAL 函數的使用方法

在ABAP中,BAPI_CURRENCY_CONV_TO_INTERNAL 函數模塊主要用于將外部金額轉換為內部存儲格式。這對于確保金額數據在SAP系統中的一致性和準確性至關重要。以下是關于該函數模塊使用方法的詳細解釋: 函數模塊參數 調用 BAPI_CURRENCY_CONV_TO_INTERNAL 時…

redis學習(005 java客戶端 RedisTemplate學習)

黑馬程序員Redis入門到實戰教程,深度透析redis底層原理redis分布式鎖企業解決方案黑馬點評實戰項目 總時長 42:48:00 共175P 此文章包含第16p-第p23的內容 文章目錄 java客戶端jedisSpringDataRedis項目實現hash哈希操作 java客戶端 jedis 測試 ps:如果連接不上&…

vs2019 無法打開項目文件

vs2019 無法打開項目文件,無法找到 .NET SDK。請檢查確保已安裝此項且 global.json 中指定的版本(如有)與所安裝的版本相匹配 原因:缺少組件 解決方案:選擇需要的組件進行安裝完成

C#靜態類與非靜態類

1、靜態類 靜態類有幾個重要的特點: 1)無法實例化:由于靜態類不能被實例化,因此它不會占用對象內存。 2)靜態成員:靜態類只能包含靜態成員(靜態方法、靜態屬性、靜態事件等)。 3&am…

步進電機改伺服電機

步進電機: 42:軸徑5mm 57:軸徑8mm 86:軸徑14mm 【86CME120閉環】// 12牛米 伺服電機: 40: 60: 80: 86: ECMA——C 1 0910 R S 4.25A 軸徑…

評價ChatGPT與強人工智能的未來

在人工智能領域,ChatGPT的出現無疑是一個里程碑事件。它不僅展示了自然語言處理技術的巨大進步,也引發了人們對于強人工智能(AGI)的無限遐想。本文將從多個角度評價ChatGPT,并探討強人工智能距離我們還有多遠。 ChatGP…

虛擬地址和物理地址

到底什么是虛擬地址呢?它和物理地址的區別又在哪呢? 一. 虛擬地址的作用 1. 使代碼的移植性更好,在不同平臺進行編譯以后,就可以直接運行,因為到別的系統,會將你的虛擬地址轉換為物理地址,而使…

無人機運營合格證及無人機駕駛員合格證(AOPA)技術詳解

無人機運營合格證及無人機駕駛員合格證(AOPA)技術詳解如下: 一、無人機運營合格證 無人機運營合格證是無人機運營企業或個人必須獲得的證書,以確保無人機在運營過程中符合相關法規和標準。對于無人機運營合格證的具體要求和申請…

無人機人員搜救

人員搜救-水域救援 水域搜救:快速水面搜查 物資拋投:救生物資拋投 繩索牽引:牽引救援繩索 領航船艇:水面偵察領航 人員搜救 晝夜搜救,精準定位 水域搜救 經緯 M300 RTK 搭載禪思 H20T 能夠滿足全天候作業需求&a…

【區分vue2和vue3下的element UI Dialog 對話框組件,分別詳細介紹屬性,事件,方法如何使用,并舉例】

在 Vue 2 和 Vue 3 中,Element UI(針對 Vue 2)和 Element Plus(針對 Vue 3)提供了 Dialog 對話框組件,用于在頁面中顯示模態對話框。這兩個庫中的 Dialog 組件在屬性、事件和方法的使用上有所相似&#xff…

新手教學系列——Git Stash踩坑

在之前的文章《如何徹底避免Git代碼相互覆蓋問題》中,我曾介紹過通過規范分支合并和使用git stash來避免代碼覆蓋問題。今天,我要深入探討一下git stash的使用,并分享一些使用過程中遇到的坑,希望能幫你避免類似問題。 腳本mg.sh簡介 為了更好地管理代碼合并,我編寫了一…

gcc: 自身編譯: opt;有個變量怎么找不到?

文章目錄 makefile/configure中間awk的轉換舉例,options.h里的內容:解開疑問makefile/configure lang_opt_files=@lang_opt_files@ $(srcdir)/c-family/c.opt $(srcdir)/common.opt# All option source files ALL_OPT_FILES=$(lang_opt_files) $(extra_opt_files

linux之管道重定向

管道與重定向 一、重定向 將原輸出結果存儲到其他位置的過程 標準輸入、標準正確輸出、標準錯誤輸出 ? 進程在運行的過程中根據需要會打開多個文件,每打開一個文件會有一個數字標識。這個標識叫文件描述符。 進程使用文件描述符來管理打開的文件(FD--…

windows USB 設備驅動開發-控制傳輸的數據包

每次在主機控制器和 USB 設備之間移動數據時,都會發生傳輸。 通常,USB 傳輸可大致分為控制傳輸和數據傳輸。 所有 USB 設備都必須支持控制傳輸,并且可以支持用于數據傳輸的端點。 每種類型的傳輸都與設備緩沖區USB 端點 的類型相關聯。 控制傳…

泛微開發修煉之旅--32ecology對接海康威視綜合安防管理系統,人臉識別機器數據同步代碼方案及源碼

文章鏈接:32ecology對接海康威視綜合安防管理系統,人臉識別機器數據同步代碼方案及源碼