首页 > 其他分享 >Laravel Macro 让你的代码更简洁,更具有可读性

Laravel Macro 让你的代码更简洁,更具有可读性

时间:2023-10-17 17:40:02浏览次数:31  
标签:Laravel Illuminate 可读性 Macro str1 vip length return

来源:http://www.shanhubei.com/archives/2806.html

你可以把它理解成为 trait 中的一个方法,还有点和我们开发中常用助手文件中 helpers 中的方法类似,其目的是将 Laravel 的内部组件进行横向扩展以全局通用。

下面我们来看一个例子:

User 表中有一个字段是 is_vip,用来记录用户是否是 VIP,当我们在控制器中进行判断时,常规的写法是:

// UserController.php

public function getVip(Request $request)
{
    if($request->user()->is_vip)
    {
        return true;
    }
    return false;
}
 

当多个控制器都有对于 is_vip 字段进行判断的分支时,代码就会变得冗余,假如 is_vip 为真时,后续还有其他判断,那么嵌套的 if 语句就会让代码逻辑变得更复杂。

if($request->user()->is_vip)
{
    if(...)
    {
        ...
    }
}

 

 

如果我们能在 Illuminate\Http\Request 类中添加一个方法来判断请求用户 is_vip 的值就好了,Macro 就是用来做这个的,我们再来改写一下之前的方法:

public function getVip(Request $request)
{
    // 先把它暂时写在控制器中。
    Request::macro('isVip', function()
    {
        if(auth()->check()) // 先做授权判断,增加代码健壮性
        {
            return $this->user()->is_vip;  // 等同于 $request->user()->is_vip, $this 指向的是 Request 的实例。
        }
        return false;
    }

    // 这样的话控制器只有一行代码了。
    return $request->isVip(); 
}

 

 

Macro 中的 $this 指向的是被扩展方法的实例,上文中的 $this 代表的是控制器中注入的 Request 实例。

再来个例子,项目中经常需要判断字符串长度是否大于等于指定长度,通常是这样:

use Illuminate\Support\Str;
public function str()
{  
    $length = 3;
    $str1 = 'cbd';
    if(Str::length($str1) >= $length)
    {
        return true;
    }
    return false;
}
 

使用 Macro 改写后如下:

use Illuminate\Support\Str;
public function str()
{ 
    // 先把它暂时写在控制器中。
    Str::macro('lengthCheck', function(string $str1, int $length)
    {
        if(self::length($str1) >= $length)
        {
            return true;
        }
        return false;
    });

    // 这样的话控制器只有一行代码了。  
    return Str::lengthCheck($str1, $length);
}
 

好了,到这里已经对 Macro 有一个基本的概念了,鼠标宏都用过吧?它不就是鼠标功能的一个扩展?鼠标本身没有连点功能,但是它提供了一个接口来让我们自定义编程,从而实现我们想要的功能。

下面我们还需要让 Macro 在框架加载时一同载入,从而实现全局调用,你可以将它写在 AppServiceProvider.php 中,如果数量不多的话,这个视情况决定。

本例中我们来创建一个 Provider,来统一将这些 Macro 放在一起。

php artisan make:provider MacrosServiceProvider
 

把上面两个 Macro 放入到 MacrosServiceProvider

<?php

namespace App\Providers;

use Illuminate\Http\Request;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Str;

class MacrosServiceProvider extends ServiceProvider
{  
    /**
     * Bootstrap services.
     *
     * @return void
     */
    public function boot()
    {
        // 判断用户是否是 VIP
        Request::macro('isVip', function(){
            if(auth()->check())
            {
                return $this->user()->is_vip;
            }
            return false;
        });

        // 判断字符串是否大于等于给定长度
        Str::macro('lengthCheck', function(string $str1, int $length)
        {
            if(static::length($str1) >= $length)
            {
                return true;
            }
            return false;
        });

    }
}

在 app.php 中加载它

'providers' => [
    ...
    \App\Providers\MacrosServiceProvider::class,
];

在开发中多考虑使用 Macro 来让你的代码更具有可读性和复用性,希望本文对你有帮助。

最后说一下,哪些 Laravel 的组件可以使用 Macro 扩展:

  • Illuminate\Auth\RequestGuard
  • Illuminate\Auth\SessionGuard
  • Illuminate\Cache\Repository
  • Illuminate\Console\Command
  • Illuminate\Console\Scheduling\Event
  • Illuminate\Cookie\CookieJar
  • Illuminate\Database\Eloquent\FactoryBuilder
  • Illuminate\Database\Eloquent\Relations\Relation
  • Illuminate\Database\Grammar
  • Illuminate\Database\Query\Builder
  • Illuminate\Database\Schema\Blueprint
  • Illuminate\Filesystem\Filesystem
  • Illuminate\Foundation\Testing\TestResponse
  • Illuminate\Http\JsonResponse
  • Illuminate\Http\RedirectResponse
  • Illuminate\Http\Request
  • Illuminate\Http\Response
  • Illuminate\Http\UploadedFile
  • Illuminate\Mail\Mailer
  • Illuminate\Routing\PendingResourceRegistration
  • Illuminate\Routing\Redirector
  • Illuminate\Routing\ResponseFactory
  • Illuminate\Routing\Route
  • Illuminate\Routing\Router
  • Illuminate\Routing\UrlGenerator
  • Illuminate\Support\Arr
  • Illuminate\Support\Collection
  • Illuminate\Support\LazyCollection
  • Illuminate\Support\Str
  • Illuminate\Support\Testing\Fakes\NotificationFake
  • Illuminate\Translation\Translator
  • Illuminate\Validation\Rule
  • Illuminate\View\Factory
  • Illuminate\View\View

附言:
关于 PHPSTORM IDE 没有 Macro 提示的问题解决方法:

安装 barryvdh/laravel-ide-helper 组件

composer require --dev barryvdh/laravel-ide-helper
 

跟着文档一步一步走就行了,注意文档中有一句话,如果要使用代码提示的话,必须根据文档中的要求来写:

为 Macro 和 Mixin 自动生成 PHPDoc

这个包可以为 Macro 和 Mixin 生成 PHPDocs,它们将被添加到 _ide_helper.php 文件中。

但这仅在您在声明宏时使用类型提示时才有效。

Str::macro('concat', function(string $str1, string $str2) : string {
    return $str1 . $str2;
});

 

 

标签:Laravel,Illuminate,可读性,Macro,str1,vip,length,return
From: https://www.cnblogs.com/shanhubei/p/17770189.html

相关文章

  • laravel 中layout模板
    Blade布局是指具有多个公共部分的布局,可以在整个应用程序中使用,无需为此加载多个文件。公共区域包括页眉、页脚、侧边栏等。它包括Blade语法。我们也使用相同的文件夹结构/resources/views来存储布局。让我们创建一个简单的基本Blade布局。在/resources/views/layouts/app.blade.p......
  • laravel一键开发阿里云短信
    提示:应用依赖芒果系统,文档末尾有链接。需求:在laravel框架中,对接阿里云短信,实现短信验证码请求。  在商店中点击一下安装按钮  在输入框内输入安装密码  点击扩展-》设置 设置好安装密码和卸载密码,提示:卸载的时候会删除本地所有代码和相关的数据库表。......
  • Laravel 设置表前缀
    Laravel是一个流行的PHP框架,被广泛地应用在Web应用程序的开发中。在Laravel中,我们可以非常方便地操作数据库,不仅支持多种类型的数据库,还提供了丰富的ORM实现,比如EloquentORM,使得我们可以非常高效地与数据库进行交互。在一些情况下,我们可能需要给Laravel的表添加一些......
  • Laravel artisan命令-make:model(创建模型类)
    描述创建新的Eloquent模型类命名规则驼峰命名,类文件名必须为数据库表名「单数」,如:app/Models/User.php用法模型通常位于app\Models目录中,如果app下没有Models目录,可以在模型前添加Models目录。有app\Models目录phpartisanmake:modelUsers无app\Models目录......
  • Laravel Repository 仓库模式【转】
    详细:1.Repository模式作用和实现原理;理论MVC分层缺点MVC作为一种传统的分层模型已经服务过很多WEB应用,非常成熟。Controller需要直接调用对应的Model来完成数据交互,这样不可避免的造成了强耦合,也造成了Controller和Model的臃肿一般控制器每个方法的代码不会超过20......
  • laravel8对接阿里云sdk刷新cdn缓存接口RefreshObjectCaches
    <?phpnamespaceApp\Admin\Forms;useEncore\Admin\Widgets\Form;useIlluminate\Http\Request;useAlibabaCloud\Client\AlibabaCloud;useAlibabaCloud\Client\Exception\ClientException;useAlibabaCloud\Client\Exception\ServerException;......
  • Laravel RCE后渗透利用
    引言水一篇文章,本文介绍了常规laravel组件RCE后的简单后渗透利用,常见的RCENday例如:CVE-2021-3129,篇幅内很多利用方式与AsperaFaspexRCE后渗透利用文章中类似,因此就不赘述了。维持权限RCE通过反弹shell命令,获取ncshell,但此时shell并不是完全交互式的,并且维持权限不方便,不......
  • 记 Laravel Sanctum 实现 token登录
    记LaravelSanctum实现token登录假设已经安装好Laravel安装LaravelSanctum.composerrequirelaravel/sanctumphpartisanvendor:publish--provider="Laravel\Sanctum\SanctumServiceProvider"phpartisanmigrate修改../app/Http/Kernel.phpuseLarave......
  • Go每日一库之152:gomacro(终端运行go代码)
    [gomacro](https://github.com/cosmos72/gomacro)是一个近乎完整的Go解释器,用纯Go实现,它同时提供交互式REPL和脚本模式,并且在运行时不需要Go工具链(除了一些非常特殊的场景:在运行时导入第三方包)。它在Go标准库之外有两个依赖项:github.com/peterh/liner和golang.org/x/......
  • php js+laravel+mysql手术麻醉临床信息系统
    医院手麻系统源码 技术架构:phpjs+laravel+mysql vue2elementB/S网页版手术麻醉临床信息系统有着完善的临床业务功能,能够涵盖整个围术期的工作,能够采集、汇总、存储、处理、展现所有的临床诊疗资料。通过该系统的实施,能够规范麻醉科的工作流程,实现麻醉手术过程的信息数字......