web-dev-qa-db-ja.com

Laravelモデルのメソッドチェーンとnullリターンを処理する方法

Model :: find($ id)でモデルを読み込んでいて、IDが見つからない場合、nullを返します。

これを連鎖させようとする場合を除いて、これは問題ありません。

Model::find($id)->loadAttributes();

Nullのメソッドではないため、属性のロードは失敗します。

単純なソリューションはそれを2行に分割し、loadAttributesを呼び出す前またはtry/catchを実行する前にnullかどうかを確認しますが、考えていない別のソリューションがあるかどうか知りたいです。

3
mkaatman

メソッドチェーンを実行できない場合は、メソッドチェーンを実行しないでください。

_$model = Model::find($id);
if ($model === null) {
  ... // handle error
}

$model->loadAttributes();
_

これはおそらく、エラーを起こしにくい方法です。通常の操作でヌルケースが予想される場合は、例外システムを使用してこれを処理しないでください。

PHP 7は、null結合演算子_??_を追加しますが、null伝播メソッド呼び出し演算子は追加しません(C#の_?._など)。 このような演算子を使用する場合 の場合、$a?->b()の呼び出しは$a === null ? $a->b() : nullと同じになる可能性があります。

時々見られるイディオムの1つは、条件内で変数を割り当てることです。

_if (($model = Model::find($id)) !== null) {
  $model->loadAttributes();
} else {
  ... // handle error
}
_

このスタイルは、割り当てられた変数のスコープを条件付きに制限し、エラー処理がない場合、戻り値がnullの場合、何もする必要がない他の言語ではより意味があります。

2
amon