登録日:
2025-03-14
最終更新日:
2025-03-19
Laravel で「Return value must be of type object, null returned」 の原因は?
Laravel で「Return value must be of type object, null returned」というエラーが発生する原因は、関数やメソッドの戻り値が object 型であると宣言されているにもかかわらず、 null を返してしまっているためです。
考えられる原因
Eloquent の find() メソッドを使用して存在しないレコードを取得
public function getUser(int $id): object
{
return User::find($id);
}
問題点:
find($id) は null を返す可能性があるが、戻り値の型が object に固定されているため、エラーが発生する。
解決策:
- ?object にして null を許容する
- findOrFail() を使って例外を投げる
修正後
public function getUser(int $id): ?object
{
return User::find($id);
}
または
public function getUser(int $id): object
{
return User::findOrFail($id);
}
クエリビルダの first() を使用してレコードが見つからない
public function getUserByEmail(string $email): object
{
return User::where('email', $email)->first();
}
問題点:
first() は null を返すことがあるため、 object 型が保証されずエラーになる。
public function getUserByEmail(string $email): ?object
{
return User::where('email', $email)->first();
}
または
public function getUserByEmail(string $email): object
{
return User::where('email', $email)->firstOrFail();
}
リレーションが null を返す可能性がある
public function getProfile(int $userId): object
{
$user = User::find($userId);
return $user->profile;
}
問題点:
profile リレーションが存在しない場合、 null になり、 object 型の戻り値制約に違反する。
public function getProfile(int $userId): ?object
{
$user = User::find($userId);
return $user?->profile;
}
または
public function getProfile(int $userId): object
{
$user = User::findOrFail($userId);
return $user->profile ?? throw new \Exception('Profile not found');
}