登录  /  注册
首页 > php框架 > Laravel > 正文

Laravel 宏指令(Macro)

藏色散人
发布: 2020-05-19 13:39:11
转载
4015人浏览过

下面由laravel/" target="_blank">laravel开发入门教程栏目给大家介绍神奇的 laravel 宏指令(macro),希望对需要的朋友有所帮助!

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\Relation

● Illuminate\Database\Query\Builder

● Illuminate\Filesystem\Filesystem

● Illuminate\Foundation\Testing\TestResponse

● Illuminate\Http\RedirectResponse

● Illuminate\Http\Request

● Illuminate\Http\UploadedFile

● Illuminate\Routing\ResponseFactory

● Illuminate\Routing\Router

● Illuminate\Routing\UrlGenerator

● Illuminate\Support\Arr

● Illuminate\Support\Collection

● Illuminate\Support\Str

● Illuminate\Translation\Translator

● Illuminate\Validation\Rule

动手

如果您发现自己在整个系统中对 Laravel 组件重复执行逻辑,请考虑使用宏以实现更好的表达和重用。相信我,非常馋。

祝您好运!

更多laravel框架技术文章,请访问laravel教程!

以上就是Laravel 宏指令(Macro)的详细内容,更多请关注php中文网其它相关文章!

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:learnku网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号