环境 ( 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) {
return $this -> map( funciton ($item) {
// return $item 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.php
的providers
里边添加App\Providers\CollectionServiceProvider::class
即可。
写在最后
最後までご覧いただいてありがとうございます~