Laravelでデータベースの編集と更新がうまくいかない
解決したいこと
Laravelでフォームからアップロードした内容を、ユーザがedit.blade.php
にある更新ボタンをクリックすると、ProfileController
のupdate
アクションへ飛び、更新できるようにしたいのですが、うまくいきません。ErrorCall to a member function fill() on null
エラーになってしまいます。以下が関連部分のコードになるのですが、知恵をお貸しいただけないでしょうか。
エラーメッセージ
Error
Call to a member function fill() on null
web.php
Route::get('profile/edit', 'App\Http\Controllers\Admin\ProfileController@edit')->middleware('auth');
Route::post('profile/edit', 'App\Http\Controllers\Admin\ProfileController@update')->middleware('auth');
ProfileController
public function edit(Request $request)
{
//Profile Modelからデータを取得する
$profile = Profile::find($request->id);
if (empty($profile)){
abort(404);
}
return view('admin.profile.edit', ['profile_form' => $profile]);
}
public function update(Request $request)
{
// Validationをかける
$this->validate($request, Profile::$rules);
// Profile Modelからデータを取得する
$profile = Profile::find($request->id);
// 送信されてきたフォームデータを格納する
$profile_form = $request->all();
unset($profile_form['remove']);
//トークンの削除
unset($profile_form['_token']);
// 該当するデータを上書きして保存する
$profile->fill($profile_form)->save();
$profileHistory = new ProfileHistory;
$profileHistory->profile_id = $profile->id;
$profileHistory->edited_at = Carbon::now();
$profileHistory->save();
return redirect('admin/profile/edit');
}
edit.blade.php(ビュー)
@extends('layouts.profile')
@section('title','プロフィールの編集')
@section('content')
<div class="container">
<div class="row">
<div class="col-md-8 mx-auto">
<h2>プロフィールの編集</h2>
<form action="{{ action('App\Http\Controllers\Admin\ProfileController@update') }}" method="post" enctype="multipart/form-data">
@if (count($errors) > 0)
<ul>
@foreach($errors->all() as $e)
<li>{{ $e }}</li>
@endforeach
</ul>
@endif
<div class="form-group row">
<label class="col-md-2">氏名</label>
<div class="col-md-10">
<input type="text" class="form-control" name="name" value="{{ $profile_form->name }}">
</div>
</div>
<div class="form-group row">
<label class="col-md-2">性別</label>
<div class="col-md-10">
<input type="text" class="form-control" name="gender" value="{{ $profile_form->gender }}">
</div>
</div>
<div class="form-group row">
<label class="col-md-2">趣味</label>
<div class="col-md-10">
<input type="text" class="form-control" name="hobby" value="{{ $profile_form->hobby }}">
</div>
</div>
<div class="form-group row">
<label class="col-md-2">自己紹介</label>
<div class="col-md-10">
<textarea class="form-control" name="introduction" rows="20">{{ $profile_form->introduction }}</textarea>
</div>
</div>
{{ csrf_field() }}
<input type="submit" class="btn btn-primary" value="更新">
</form>
<div class="row mt-5">
<div class="col-md-4 mx-auto">
<h2>編集履歴</h2>
<ul class="list-group">
@if ($profile_form->profileHistories != NULL)
@foreach ($profile_form->profileHistories as $profileHistory)
<li class="list-group-item">{{ $profileHistory->edited_at }}</li>
@endforeach
@endif
</ul>
</div>
</div>
</div>
</div>
</div>
@endsection
自分で試したこと
①
updateアクションにてデバッグ。dd($request->id)
でnullであることを確認。
パラメータが渡せていないので、URLに{id}
を記載した。
Route::post('profile/edit{id}', 'App\Http\Controllers\Admin\ProfileController@update')->middleware('auth');
②
Illuminate\Http\Request
クラスをコントローラメソッドに指定されていることを確認した。
0