ヘルパ 5.5 Laravel#optional
optionalはLaravelのヘルパ関数のひとつです。次の様な使い方でnull値のプロパティを参照しようとする致命的エラーを防げます。
1 2 3 | return optional( $user ->address)->street; // address===nullでもstreetを参照せずにnullをretuenする {!! old( 'name' , optional( $user )->name) !!} // $user===nullでもnameを参照せずにnullをoldの第二引数にする |
これは特にプロパティの連鎖するリレーションで強力です。このヘルパ関数は一見素晴らしいですがその実用性は程々です。issetよりいくらかまし程度です。具体的に何が問題化というと
1 2 | optional( $user ->address->city)->name // addressがnullだと引数生成時点でnullのプロパティ参照を行おうとして致命的エラー optional( $user ->address)->city->name // cityがnullだとnull値のnameプロパティ参照を行おうとして致命的エラー |
の様に3段先を見る時点で安全性が担保されなくなります。
1 | optional(optional( $user ->address)->city)->name |
とすると無駄に長くなりissetと変わりません。これはoptional関数が行っていることが、Optionalクラスのインスタンスを生成し、そのマジックメソッドを用いて通常のアクセスに代わって直下のメソッド、プロパティの参照ミスをnull値に書き換える、という処理のみであることが原因です。
Optionalクラスのファイルはvendor/laravel/framework/src/Illuminate/Support/Optional.phpにあります。任意の型の引数を自由に操るためのクラスというだけあってなかなかの抽象度ですが、100行程の短いクラスにまとめられています。これを参考に自前で再帰optional関数を作るのもよいかもしれません(おそらく呼び出された時点のコードから先を実行前に読み取るか、プロパティもoptional型に加工することになる)。