【Laravel】リソースコントローラーで情報のアップデート処理を行う方法【CRUD】
Laravelで投稿の更新機能を作成しました。
備忘録的に開発手順を公開しておきます。
完成予想図は以下です。
それでは、さっそくまとめていきます。
リソースコントローラーを作成する
$ php artisan controller:make PostController
ルーティングの設定
Route::resource('posts', 'PostController');
リソースコントローラー(Postコントローラー)へアップデート処理に必要なメソッドをつくる。
使う機能は、editとupdateです。まずは、editから作っていきます。
public function edit($id){
$post = Post::find($id);
return View::make('posts.edit')
->with('post', $post);
}
editのビューをつくる
@extends('layouts.default')
@section('content')
<h1>編集ページ</h1>
{{-- 投稿完了時にフラッシュメッセージを表示 --}}
@if(Session::has('success'))
<div class="bg-info">
<p>{{ Session::get('success') }}</p>
</div>
@endif
{{ Form::model($post, array('route' => array('posts.update', $post->id), 'method' => 'PUT')) }}
<div class="form-group">
{{-- バリデーションのエラー表示 --}}
@foreach($errors->get('title') as $message)
<span class="bg-danger">{{ $message }}</span>
@endforeach
<label for="title" class="col-sm-2 control-label">タイトル</label>
<div class="col-sm-10">
{{ Form::text('title', null, array('class' => 'form-control')) }}
</div>
</div>
<div class="form-group">
{{-- バリデーションのエラー表示 --}}
@foreach($errors->get('content') as $message)
<span class="bg-danger">{{ $message }}</span>
@endforeach
<label for="content" class="col-sm-2 control-label">本文</label>
<div class="col-sm-10">
{{ Form::textarea('content', null, array('class' => 'form-control')) }}
</div>
</div>
<div class="form-group">
<button type="submit" class="btn btn-primary">変更する</button>
</div>
{{ Form::close() }}
@stop
※注意点(1):Form::model
に関して
上記のフォームの書き方をすることで、フォームのインプット内に自動的にDB情報を表示することができます。
// このように記述するだけで、LaravelがDBから情報を引っ張ってきてくれます
{{ Form::text('title', null, array('class' => 'form-control')) }}
※注意点(2):'method' => 'PUT'
に関して
これはLaravelのリソースコントローラーを利用するときの決まった書き方です。
このように記述することで、Laravelがリソースコントローラーを把握して、自動処理してくれます。
つぎにupdateメソッドを作っていきます。
public function update($id){
$rules = array(
'title' => 'required',
'content'=>'required',
);
$messages = array(
'title.required' => 'タイトルを正しく入力してください。',
'content.required' => '本文を正しく入力してください。',
);
$validator = Validator::make(Input::all(), $rules, $messages);
if ($validator->passes()) {
$post = Post::find($id);
$post->title = Input::get('title');
$post->content = Input::get('content');
$post->save();
return Redirect::back()->with('success', '投稿が更新されました');
}else{
return Redirect::back()
->withErrors($validator)
->withInput();
}
}
※注意点:Redirect::back()
に関して。
ページ更新された際に、同じページに滞在しつつ、successメッセージを表示するときに使います。
これめっちゃ便利です。
以下のような書き方でいいじゃんと思うかもしれませんが、ページURLに付与されているIDの関係でエラーがでたりするので、Redirect::back()
つかうのが無難です。
return Redirect::route('posts.edit')->with('success', '投稿が更新されました。');
これだけで完成です。秒速ですね。