Written by Manabu Bannai

【Laravel】リソースコントローラーで情報のアップデート処理を行う方法【CRUD】

Laravel PROGRAMMING

Laravelで投稿の更新機能を作成しました。
備忘録的に開発手順を公開しておきます。
完成予想図は以下です。

Screen Shot 2014-11-03 at 8.36.04 PM

それでは、さっそくまとめていきます。

リソースコントローラーを作成する

$ 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', '投稿が更新されました。');

これだけで完成です。秒速ですね。

※P.S:無料メルマガで発信中:過去の僕は「ブログ発信で5億円」を稼ぎました。次は「30億円」を目指します。挑戦しつつ、裏側の思考を「メルマガ」から発信します。不満足なら1秒で解約できます。無料登録は「こちら」です。