【Laravel】null値のプロパティ参照を避けるoptional関数

ヘルパ 5.5 Laravel#optional
 optionalはLaravelのヘルパ関数のひとつです。次の様な使い方でnull値のプロパティを参照しようとする致命的エラーを防げます。

return optional($user->address)->street;// address===nullでもstreetを参照せずにnullをretuenする

{!! old('name', optional($user)->name) !!}// $user===nullでもnameを参照せずにnullをoldの第二引数にする

 これは特にプロパティの連鎖するリレーションで強力です。このヘルパ関数は一見素晴らしいですがその実用性は程々です。issetよりいくらかまし程度です。具体的に何が問題化というと

optional($user->address->city)->name // addressがnullだと引数生成時点でnullのプロパティ参照を行おうとして致命的エラー
optional($user->address)->city->name // cityがnullだとnull値のnameプロパティ参照を行おうとして致命的エラー

 の様に3段先を見る時点で安全性が担保されなくなります。

optional(optional($user->address)->city)->name

 とすると無駄に長くなりissetと変わりません。これはoptional関数が行っていることが、Optionalクラスのインスタンスを生成し、そのマジックメソッドを用いて通常のアクセスに代わって直下のメソッド、プロパティの参照ミスをnull値に書き換える、という処理のみであることが原因です。
 Optionalクラスのファイルはvendor/laravel/framework/src/Illuminate/Support/Optional.phpにあります。任意の型の引数を自由に操るためのクラスというだけあってなかなかの抽象度ですが、100行程の短いクラスにまとめられています。これを参考に自前で再帰optional関数を作るのもよいかもしれません(おそらく呼び出された時点のコードから先を実行前に読み取るか、プロパティもoptional型に加工することになる)。
 

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG