目次
- あまり知られていないLaravelのコレクションメソッド #1: macro (本記事)
- あまり知られていないLaravelのコレクションメソッド #2: concat
背景
Laravelのコレクション、使いこなしていますか?
以下の記事を先程読んで面白いと思いました。
「あなたは使ったことがないLaravelのコレクションメソッド10選」
ただし、英語で書かれていますし、各メソッドの説明が不十分に感じました。
ということで、以上の記事を翻訳する上で、それぞれのメソッドの活用方法を説明していきたいです!
今回はCollectionのmacroメソッドを解説します!
macro: 全てのコレクションにカスタムメソッドを追加する
概要
スタティックメソッドになり、以下のように呼び出すことができます。
Collection::macro('カスタムメソッド', function ($arg1, $arg2) {
// カスタムメソッド処理
});
定義したカスタムメソッドはどのコレクションでも使えます!
collect([1, 2])->カスタムメソッド(1, 'abc'); // 日本語のメソッド名はあり!!
実用性が意外と高いです。例えば、コレクション内の文字列を大文字に変換するには↓
Collection::macro('toUpper', function () {
return $this->map(fn ($value) => Str::upper($value));
});
collect(['abc', 'def'])->toUpper();
// ['ABC', 'DEF']
全角半角変換も簡単にできます!
Collection::macro('toZenkaku', function () {
return $this->map(fn ($value) => mb_convert_kana('ask'));
});
Collection::macro('toHankaku', function () {
return $this->map(fn ($value) => mb_convert_kana('ask'));
});
collect(['811', 'John', '-'])->toZenkaku();
// ['811', 'John', '-']
collect(['811', 'John', '-'])->toHankaku();
// ['811', 'John', '-']
カスタムメソッドの定義はどこに置くの?
公式ドキュメント曰く、
Typically, you should declare collection macros in the boot method of a service provider.
通常、コレクションマクロはサービスプロバイダのbootメソッドで宣言する必要があります。
ということで、AppServiceProviderに置きましょう。
app/Providers/AppServiceProvider.php
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*/
public function boot(): void
{
Collection::macro('カスタムメソッド', function ($arg1, $arg2) {
// カスタムメソッド処理
});
// ...
}
}
参考
まとめ
いかがでしたか?
今度はconcatメソッドなど、あまり知られていないLaravelのコレクションメソッドをさらに解説していきたいです。
ではまた!