[Laravel]object_get ヘルパー
こんにちは、ナカエです。
Laravelユーザーの皆さんは、配列のネストした要素をドット記法で取得できるarray_get()をよく利用されている方も多いと思います。 手軽に配列のUndefined indexエラーを回避できる方法ですね。
そのオブジェクト版がobject_get()です。 オブジェクトのプロパティをドット記法で記述することで、ネストしたオブジェクトのプロパティの取得を試み、取得できなければデフォルト値を返します。
利用例
マジックメソッドを利用したプロパティにも対応しているため、たとえばbelongsToのリレーションでリレーション先がnullである可能性がある場合などにも利用できます。
特にリレーションを多段で確認する際に有用です。
モデル
//略
class Post extends Model {
public function category()
{
return $this->belongsTo(Category::class);
}
}
class Category extends Model {
public function parent()
{
return $this->belongsTo(Category::class);
}
}
リレーションをたどる素直なコード
$post = Post::find(1);
if(is_null($post->category)) {
$parentCategoryName = '';
} else if(is_null($post->category->parent)) {
$parentCategoryName = '';
} else {
$parentCategoryName = $post->category->parent->name;
}
object_getを利用して書き直す場合
$post = Post::find(1);
$parentCategoryName = object_get($post, 'category.parent.name', '');
array_get()に比べると活躍の機会は少ないかもしれませんが、便利に使えることがよくあります。
\Illuminate\Support\Arrのstaticメソッドを呼び出すarray_get()や、DIコンテナによるインスタンスの解決を行って処理を移譲するタイプのヘルパと異なり、 object_get()は依存が少なくソースが追いやすいのも良いところです。