Laravel宏指令Macro使用
宏指令允许添加自定义功能到 Laravel 的内部组件里去,App\Providers\AppServiceProvider boot()方法中注册。
Request
#注册 Request::macro('introduce', function ($name) { return 'Hello ' . $name . '!'; }); #使用 dump(Request::introduce('lily')); // "Hello lily!" dump(request()->introduce('lily')); // "Hello lily!"
Response
#注册 \Illuminate\Support\Facades\Response::macro('success', function ($data = [], $message = 'success') { return new \Illuminate\Http\JsonResponse([ 'code' => 0, 'data' => $data, 'message' => $message ], 200); }); #使用 return response()->success(['a' => 1], 'success'); //{"code":0,"data":{"a":1},"message":"success"}
Builder
#注册 \Illuminate\Database\Query\Builder::macro('whenFlagMatches', function ($flag, $callback) { if ($flag) { call_user_func($callback->bindTo($this)); } return $this; }); \Illuminate\Database\Query\Builder::macro('toRawSql', function () { return array_reduce($this->getBindings(), function ($sql, $binding) { return preg_replace('/\?/', is_numeric($binding) ? $binding : "'" . $binding . "'", $sql, 1); }, $this->toSql()); }); \Illuminate\Database\Eloquent\Builder::macro('toRawSql', function () { return ($this->getQuery()->toRawSql()); }); #使用 $is_super = true; $query = Post::whenFlagMatches($is_super, function () { $this->where('id', '=', 5); }); $query2 = DB::connection()->table('posts')->whenFlagMatches($is_super, function () { $this->where('id', '=', 5); }); dump($query->toRawSql()); //select * from `posts` where `id` = 5 dump($query2->toRawSql()); //select * from `posts` where `id` = 5 dump($query->get()->toArray()); //得到的结果为纯php数组形式 dump($query2->get()->toArray());//得到的结果为元素为对象的数组
Collection
#注册 \Illuminate\Support\Collection::macro('toUpper', function () { return $this->map(function ($value) { return \Illuminate\Support\Str::upper($value); }); }); \Illuminate\Support\Collection::macro('toLocale', function ($locale) { return $this->map(function ($value) use ($locale) { return \Illuminate\Support\Facades\Lang::get($value, [], $locale); }); }); #使用 $collection = collect(['Name', 'Email']); dump($collection->toUpper()->toArray()); // ['NAME','EMAIL'] $collection = collect(['label.Name', 'label.Email']); $translated = $collection->toLocale('zh_CN'); dump($translated->toArray());// ['用户名','电子邮箱'] #toLocale需要预先在resources/lang/zh_CN/label.php放如以下内容 return [ 'Name'=>'用户名', 'Email'=>'电子邮箱', ];
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix