Laravel5.8 使用 macro 扩充 集合(collection)

环境 ( Environment )

  • Ubuntu 18.04
  • Apache2.4
  • php7.2

介绍

Laravel使用了Macroable trait 的类都可以使用macro方法扩展,如:

  • Response
  • Request
  • Collection
  • HTML
  • Form
  • Filesystem
  • Cache
  • Str
  • Arr
  • Translator

等等,来源:使用 macro 方法来扩展 Laravel 的基础类的功能,本文介绍如何使用macro扩展集合( Collection )。


扩展集合(Expand Collection)

添加自定义方法扩展集合的方式如下

<?php

    Collection::macro('methodName', function (parameters) {
        returnthis -> map( funciton (item) {
            // returnitem after process, like: 
            // return ucword($item);
            //.....
        } );
    });

下面是Laravel官方文档中的一个例子

<?php

    use Illuminate\Support\Str;

    Collection::macro('toUpper', function() {
        return this -> map( function(value ) {
            return Str::upper( value );
        } )
    });collection = collect( [ 'first', 'second' ] );
    $collection -> toUpper();

    // [ 'FIRST', 'SECOND' ]

然而,如果每次用到collection的时候都要在前面加这样的一段代码才能使用自定义的方法,这样的写法显然是不大好的。参考 使用 macro 方法来扩展 Laravel 的基础类的功能 这篇文章,为了全局使用自定义的方法,我们需要创建一个ServiceProvider

<?php
namespace App\Providers;

use Collection;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Str;

class CollectionServiceProvider extends ServiceProvider
{
    public function boot()
    {
        Collection::macro( 'toUpper', function() {
            return this -> map( function(value ) {
                return Str::toUpper( $value );
            } );
        } );
    }
}

然后在config/app.phpproviders里边添加App\Providers\CollectionServiceProvider::class即可。

写在最后

最後までご覧いただいてありがとうございます~

点赞

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注