首页 > 其他分享 >Laravel 宏指令(Macro)动态添加自定义方法到Laravel的核心组件中

Laravel 宏指令(Macro)动态添加自定义方法到Laravel的核心组件中

时间:2024-07-05 14:00:29浏览次数:17  
标签:Laravel function return 自定义 Macro Route 指令 macro

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 大全

标签:Laravel,function,return,自定义,Macro,Route,指令,macro
From: https://blog.csdn.net/nbplus_007/article/details/140206503

相关文章

  • ubuntu 自定义开机画面
    1. 修改UEFI固件图片2. 修改GRUB背景图片3. 修改Plymouth启动画面 1. 固件和启动过程UEFI固件加载图片:在系统启动时,UEFI固件首先加载,并显示制造商的Logo(如“LEGION”),这在启动过程中称为“splashscreen”。这张图片是嵌入在UEFI固件中的,用户通常无法直接修改或访问......
  • vue2和vue3自定义指令实现只读模式,禁止用户编辑
    解决代码表单组件大量disable的麻烦,实现只读。只需要在需要的地方加上v-read-only即可达到只读效果,快捷方便。实现思路父元素下添加一个遮罩层元素遮罩层元素的显示隐藏由参数决定要想简单快捷的实现,最好用的就是写一个遮罩层,通过遮罩来隔绝用户的操作。原始代码如下:<temp......
  • 微信小程序-自定义组件数据监听器observers
    一.监测自定义组件data值定义data值,在.js文件里面定义data值data:{num:10,count:100,obj:{name:'tom',age:10},arr:[1,2,3]}只有在data值进行改变后才会触发到数据监听的回调函数,如果数据没有改变回调函数不会被触发ob......
  • python logging 自定义备份的日志文件命名
    importtimeimportloggingfromlogging.handlersimportTimedRotatingFileHandlerdeflog_file_namer(log_file_name):log_file_name_split=log_file_name.split('.')log_suffix=log_file_name_split.pop(1)log_file_name_split.append(l......
  • 深入 Laravel 的错误处理与异常处理机制
    引言Laravel是一个优雅而强大的PHPWeb应用框架,它提供了一系列工具来帮助开发者处理应用中的错误和异常。了解Laravel的错误处理和异常处理机制对于构建健壮和用户友好的应用程序至关重要。本文将深入探讨Laravel如何实现错误和异常处理,并提供一些实际的代码示例。......
  • python教程:自定义函数
    1.多态我们可以看到,Python不用考虑输入的数据类型,而是将其交给具体的代码去判断执行,同样的一个函数(比如这边的相加函数my_sum()),可以同时应用在整型、列表、字符串等等的操作中。在编程语言中,我们把这种行为称为多态。这也是Python和其他语言,比如Java、C等很大的一个不同点......
  • uniapp 开发微信小程序自定义与胶囊平行的导航栏
    1、page.json中使用custom自定义导航栏{ "path":"pages/partners/index", "style":{ "navigationBarTitleText":"", "navigationStyle":"custom"//自定义导航栏样式 } },2、vue文件:<template> ......
  • 在Linux中,自定义解析域名的时候,可以编辑哪个⽂件?是否可以⼀个ip对应多个域名?是否⼀个
    在Linux系统中,如果你想要自定义域名解析,通常有以下几种方法:编辑/etc/hosts文件:hosts文件是一个本地DNS解析文件,它允许你将域名映射到IP地址。你可以编辑这个文件来自定义域名解析。例如:192.168.1.10example.comwww.example.com在这个例子中,192.168.1.10是IP地址,exampl......
  • Log4Net配置详解及输出自定义消息类示例
    1.简单使用实例1.1添加log4net.dll的引用。  在NuGet程序包中搜索log4net并添加,此次我所用版本为2.0.17。如下图:1.2添加配置文件  右键项目,添加新建项,搜索选择应用程序配置文件,命名为log4net.config,步骤如下图:1.2.1log4net.config简单配置示例  下面是一个简单的......
  • Go语言--自定义函数
    定义格式函数构成代码执行的逻辑结构。在Go语言中,兩数的基本组成为:关键字func、函数名、参数列表、返回值、所数体和返回语句。函数定义说明:func:函数由关键字func开始声明FuncName:函数名称,根据约定,数名首字母小写即为private,大写即为public.参数列表:函数可以有0......