5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Laraconのペアプロで生まれたCollection::ensure()の関数

Posted at

はじめ

Laravelを使っている皆様はもうすでにご存知かと思いますが、7月19日〜20日にLaraconが行われました。そこでテーラーさんがLaravel 11の機能をデモしたり、いろいろな大事な発表が行われた上、宴会(飲み会)も行われ、エンジニア同士で気軽にワイワイしながらコミュニケーションを取ることもできました。その際、数人のエンジニアとの会話から、アイデアが生まれ、宴会でペアプロを行ったようです。今回紹介するensureの関数はそのペアプロの結果です。

ensureが生まれた理由

コレクションは開発者にとって欠かせないものかと思いますが、残念ながらコレクションの中身の型付けを設定することができません。そのため、下記のように一つのコレクションでも複数の種類の型のものが混ざってしまう可能性もあり、ランタイムに例外が発生するケースがあります。

    $collect = collect([1, 2, 3, 'happy']);

    $newCollect = $collect->map(
        fn ($item) => $item * 10 // 'happy' * 10 でTypeErrorが発生する
    );

ensure()の関数はそのようなランタイムのエラーが起こる前に、コレクションの中身の型がすべて同じかどうかのチェックを行う役割を果たします。

ensureの使い方

確認したいコレクションに対してensure()関数を呼び出し、確定したい型のstringを引数として渡すことです。

    $collect = collect([1, 2, 3, 4]);

    $collect->ensure('int');

string・int・boolといった基本の型の他にも、Modelなどのどんなクラスの型も確認できます!

    $collect->ensure(App\User::class);

定義していない型のアイテムがある場合、UnexpectedValueExceptionのエラーが発火されるようになっています。ensureの判定ではPHPのget_debug_type()を使っているため、厳密な比較となり、PHPではよくあるstring -> intbool -> intなどの変換を考慮する必要がありません。

    $collect = collect([1, 2, 3, 'happy']);

    $collect->ensure('int'); // happyでUnexpectedValueExceptionで発生する
    
    // 厳密比較の例
    $collect = collect([true, false, 0, null, 'true', 'false']);

    $collect->ensure('bool'); // 0でUnexpectedValueExceptionで発生する

まとめ

Laravelの10.15に追加されたensure()の関数で、コレクションに対して処理する前に、中身のすべてが期待している型かどうかをチェックできるようになりました。

この機能は便利ですが、私がこの機能を紹介する理由としては、この機能が生まれた背景です。数年間の間、コロナの影響でこのような宴会・LT大会などのエンジニア同士の集まる機会は減少しました。そのため、エンジニア同士の交流や会話が減少しました。こうしたイベントが少しずつ増え、これからのエンジニア同士の交流から生まれることをとても楽しみにしています!

EnsureのPR
Laravel 10公開ドックス
Laravel 10.17リリース

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?