役立つ情報
登録日: 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');
}

Copyright 役立つ情報.net