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-macros

php 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.mfbz.cn/a/774030.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

推荐的一键下载1688高保真原图信息

图片在电商中扮演着至关重要的角色。高质量的商品图片能够直观展示产品特性,吸引消费者注意力,提升购买欲望。良好的视觉呈现还能增强品牌形象,提高转化率。此外,图片是跨语言的沟通方式,能够克服语言障碍,…

linux——小细节(Makefile)(gdb)

一、makefile a.out:main.c func.cgcc main.c func.cclean:rm a.out a.out:main.c func.cgcc $^ -o $clean:rm a.out SRCmain.c func.c OBJa.out CCgcc FLAG -g -lpthread $(OBJ):$(SRC)$(CC) $(SRC) $(FLAG)clean:rm $(OBJ) 二、gdb

快速傅里叶变换(Fast Fourier Transform)

快速算法(FFT),即快速傅里叶变换(Fast Fourier Transform),是一种用于计算离散傅里叶变换(DFT)及其逆变换的高效算法。FFT算法由J.W.库利和T.W.图基于1965年提出,显著减少…

7-google::protobuf::io命名空间下常用的C++ API----zero_copy_stream_impl.h

一、protobuf输入输出文件流C API总览 二、经常会用到的API

昇思25天学习打卡营第12天|MindSpore-基于MobileNetv2的垃圾分类

基于MobileNetv2的垃圾分类 主要介绍垃圾分类代码开发的方法。通过读取本地图像数据作为输入,对图像中的垃圾物体进行检测,并且将检测结果图片保存到文件中。 1、实验目的 了解熟悉垃圾分类应用代码的编写(Python语言);了解Linux操作系统的基本使用;掌握atc命令进行模型…

每日Attention学习8——Rectangular self-Calibration Attention

模块出处 [ECCV 24] [link] [code] Context-Guided Spatial Feature Reconstruction for Efficient Semantic Segmentation 模块名称 Rectangular self-Calibration Attention (RCA) 模块作用 空间注意力 模块结构 模块代码 import torch import torch.nn as nn import tor…

Redis基础教程(十四):Redis连接

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 💝&#x1f49…

Turborepo简易教程

参考官网:https://turbo.build/repo/docs 开始 安装全新的项目 pnpm dlx create-turbolatest测试应用包含: 两个可部署的应用三个共享库 运行: pnpm install pnpm dev会启动两个应用web(http://localhost:3000/)、docs(http://localhost…

程序员,去哪个城市工作更幸福?

深漂、沪漂、京漂、杭漂……又是一年毕业季,作为CS专业or新手程序员会选择什么城市工作呢?希望这篇文章给各位一些参考。 根据拉勾招聘大数据研究院的数据显示,超六成程序员集中在一线城市,其中北京19%,深圳16%&#x…

【遇坑笔记】Node.js 开发环境与配置 Visual Studio Code

【遇坑笔记】Node.js 开发环境与配置 Visual Studio Code 前言node.js开发环境配置解决pnpm 不是内部或外部命令的问题(pnpm安装教程)解决 pnpm : 无法加载文件 C:\Program Files\nodejs\pnpm.ps1,因为在此系统上禁止运行脚本。 vscode 插件开…

汇川H5U小型PLC不用写程序测试EC总线电机

目录 新建工程添加EtherCAT组态添加运动控制轴仿真测试 新建工程 新建一个H5U工程,不使用临时工程 系列选择H5U即可 添加EtherCAT组态 这里在EC总线中添加了一个汇川660的伺服 驱动参数使用默认 添加运动控制轴 新建一个轴Axis_0 将新建的轴和EC组态的660驱动…

中国1km高分辨率高质量逐年近地表CO数据集(2013-2022年)

该数据为中国高分辨率高质量逐年CO数据集,该数据集主要的空间范围覆盖整个中国,其中内容包括中国1km高分辨率高质量逐年CO数据集(2013-2022年)。时间分辨率为年,单位为mg/m3,数据以(.nc/.tif)格式进行存储。

解决 npm intasll 安装报错 Error: EPERM: operation not permitted

Node.js安装及环境配置完成之后 npm install express -g 安装全局的模块报错提示没有权限operation not permitted mkdir 错误编号4048: 其原因是当前用户操作该目录权限不足,当以管理员身份运行cmd,再执行npm install express -g 是不会报权…

使用 AlphaZero 和 Tabu 搜索查找越来越大的极值图

使用 AlphaZero 和 Tabu 搜索查找越来越大的极值图 AlphaZero 方法最佳研究(第1部分) 文章目录 一、说明二、引言三、预备知识四、方法4.1 AlphaZero4.2 禁忌搜索 五、实验与结果六、讨论七、附录A 一个例子B 问题背景 一、说明 人工智能的树和图的检索问…

Solution

(解决方案)可行性研究报告暨设计方案-zengwenfeng.doc 基本上都要300-500多页,大型【纯软件】,县级0-200万,市级项目500-1500万不等,省部级1000-10000万不等都有。本例为过往已完成项目案例目录结构。搞方案都要准备1-3个月呢。所…

Windows搭建本地对象存储服务MinIO并且使用springboot整合

开发文档: MinIO Windows中文文档 MinIO Object Storage for Windows (英文文档) 1、准备工作 准备一个空的文件夹,用来存放minio相关的内容; 这里是在D盘创建一个minio的文件夹; 后续所有跟MinIO相关…

探寻操作系统文件名字符限制的规则和历史

引言 从最早的电脑系统到现代的操作系统,文件命名的规则一直在不断发展,这些规则体现了不同操作系统设计哲学的差异。作为开发者,了解这些差异和背后的历史渊源非常有价值,本文将详细探讨Windows、macOS和Linux三大主流操作系统在…

【网络安全】第7讲 计算机病毒概述(笔记)

一、计算机病毒的简介 1、名称的由来 由生物医学上的 “病毒” 一词借用而来。 (1)与生物医学上“病毒”的异同 同:都具有传染性、流行性、针对性等。异:不是天生的,而是人为编制的具有特殊功能的程序。 2、病毒的起…

(附源码)springboot高校全流程考勤系统-计算机毕设 27637

Springboot高校全流程考勤系统 摘 要 本文针对高校考勤等问题,对其进行研究分析,然后开发设计出高校全流程考勤系统以解决问题。高校全流程考勤系统系统主要功能模块包括:考勤签到、课程信息、考勤情况、申请记录列表等,系统功能设…

python运维开发 业务服务监控详解

业务监控是运维体系中最重要的环节,是保证业务服务质量的关键手段,python在监控方面提供了大量的第三方工具,可以帮助我们快速、有效的开发企业级服务监控平台 一、文件内容差异对比方法 difflib作为python的标准库模块,无需安装…