【Laravel】Trying to get property フィールド名 of non-objectについて
以下のサンプルにてPHPUnitを行いました。
そこで発生したエラーとその解決法についてです。
そこで発生したエラーとその解決法についてです。
<ul>
@foreach ($data as $item)
<li>{{ $item->name }}[{{ $item->mail }}, {{ $item->age }}]</li>
@endforeach
</ul>
<form action="/hello" method="post">
@csrf
<p>ID: <input type="text" id="id" name="id"></p>
<input type="submit">
</form>
Route::get('/hello','HelloController@index')->name('hello');
Route::post('/hello','HelloController@send')->name('hello');
public function index()
{
$result = [];
$data = [
'msg' => 'This is Vue.js application',
'data' => $result
];
return view('hello/index', $data);
}
public function send(Request $request)
{
$id = $request->input('id');
$person = Person::find($id);
$data = [
'msg' => 'id=' . $id,
'data' => [$person],
];
return view('hello.index',$data);
}
これで次の
$this->post('/hello')->assertOk();
を通すと
「Response status code [500] does not match expected 200 status code.」
というエラーがでます。
logを見てみると
「Trying to get property ‘name’ of non-object」
というエラーがでています。
Eloquentのモデルを利用していると起きることがあるんですが、どこでエラーが出ているかというと、
<li>{{ $item->name }}[{{ $item->mail }}, {{ $item->age }}]</li>
ここです。
このエラーの意味するところは、端的に言うと、そんなプロパティねーよ、てことですかね。
というか、このままpostしたらそりゃ中身nullですよね。
まぁとりあえずこの解決法は次のヘルパを使います。
optional()
先程のコードを以下のように直します。
<li>{{ optional($item)->name }}[{{ optional($item)->mail }}, {{ optional($item)->age }}]</li>
するとあら不思議、phpunitテスト通っちゃいます。
これは渡されたオブジェクトに対し、is_objectが真であればオブジェクトとプロパティを渡し、null時の例外を回避します。
ということで、なんか有名なヘルパ関数みたいですね。
・・・知らなかった・・・
参考
- タグ:
- Laravel
