简单来说,laravel的macro就是可以添加到laravel的class里面的静态方法。
例如你可能用过laravel的Illuminate\Support\Str里面的如random的方法。例如:
Str::random(5);
我们可以通过laravel的app\providers\appserviceprovider.php里面的boot方法里面添加。
可以添加方法的macro方法的laravel class列表如下:
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
下面我们直接在Str里面加一个自己的方法,在App\Providers\AppServiceProvider.php文件的boot方法里面:
Illuminate\Support\Str::macro("addString", function($string){
return "ab-".$string;
});
这样我们就可以通过Illuminate\Support\Str::addString()方法来直接用了。
我们可以看到,macro方法接收的第一个是方法的名称,第二个是一个闭包。
如果我们想加更多的方法都可以这样添加,但是如果我们有很多方法,这个boot里面就很臃肿了。
为了解决这个问题,我们可以把所有的方法分类放到一个文件里,这样mixin就派上用场了。
我们可以做一个class,在class里面放进很多方法,然后在boot方法里,通过mixin这个静态方法来引入。例如:
Str::mixin(new Strmixins());
注意,这里Strmixins是我们自己的class. 这个class如何做呢?
我们可以做一个文件夹在app\Mixins并且做一个class文件。只要我们改写一下刚才的方法到这个class里面即可:
class Mixins{
function addString(){
return function($string){
return "ab-".$string;
}
}
}
网友评论