laravel4 フォーム構築2

Posted: 2014-03-01 19:07 |  laravel 
フォームの一連の動作等は下記で公開しています
Tutorial.Application


下記の情報は古いです

laravel4 formのバリデート、確認画面〜完了画面編です。
前回作成した登録画面のほか、確認画面を作成します。

Route::get('/test/form', 'TestController@getForm');
Route::post('/test/confirm', 'TestController@postConfirm');
Route::post('/test/apply', 'TestController@postApply');
で指定した通り、TestControllerに 確認画面のgetConfirmを実装しますが、
重複リクエスト阻止の為に登録画面を以下の様にします。

登録画面

        const FORM_SESSION_KEY = 'test_form';
	public function getForm()
	{
		$data['title'] = 'test form';
		// 重複リクエスト
		\Session::put(self::FORM_SESSION_KEY, \Session::token());
		return \View::make('test.form', $data);
	}
よくある実装方法ですが、
\Session::put(self::FORM_SESSION_KEY, \Session::token());
tokenの値をsessionに保存します。
登録処理等を実行後、保存したtokenを削除し、
リクエスト時にtokenの有無を確認し、重複リクエストを防ぐというものです。
csrfフィルターも適用してしまいましょう。
次に確認画面です。
 

確認画面

	public function postConfirm()
	{
		// 指定のページへ戻す
		if(!\Session::get(self::FORM_SESSION_KEY))
		{
			return \Redirect::to('test/form/');
		}
		$data['title'] = 'test confirm';
		// validate 受け取るパラメータを配列で指定します
		$rules = array(
			'title' => array('required'),
			'body' => array('required'),
			'email' => array('required','email')
		);
		// validateメッセージを指定
		$messages = array(
			'title.required' => 'タイトルを入力してください',
			'body.required' => '本文を入力してください',
			'email.required' => 'メールアドレスを入力してください',
			'email.email' => 'メールアドレスを正しく入力してください',
		);
		
		//validator
		$validator = \Validator::make(\Input::all(), $rules, $messages);
		// validateにerrorがあれば、true, falseが返却されます
		if ($validator->fails())
		{
			return \Redirect::to('test/form')->withErrors($validator)->withInput();
		}
		
		return \View::make('test.confirm', $data);
	}
validateの基本的な実装は上記の様になると思います。
日本語のconfigを使っている方は、$messageを指定せずにそのままでも良いかと思います。
errorメッセージの指定は上記の様にカスタマイズできます。
カスタムバリデートルールについては外部で定義し、requiredするのが一番シンプルで分かりやすいかと思います。

後日サンプル掲載予定

フォームはcodeigniterやfuelPHP、またその他の多くのフレームワークと同様に簡単に実装できます。
 

確認画面テンプレート

{{$title}}
{{ Form::open(array( 'url' => '/test/apply', 'method' => 'post', )) }}
タイトル	{{ Input::get('title') }} {{ Form::hidden('title', Input::get('title')) }}
本文	{{ Input::get('body') }} {{ Form::hidden('body', Input::get('body')) }}
メールアドレス	{{ Input::get('email') }} {{ Form::hidden('email', Input::get('email')) }}
{{ Form::submit('apply', array('class'=>'btn btn-primary', 'name' => '_apply')) }}
{{ Form::submit('return', array('class'=>'btn btn btn-warning', 'name' => '_return')) }}
{{ Form::close() }}
 テンプレート側は特に難しいものは無いと思います。
標準の実装では上記の様になると思います。
validateで指定された配列を対象にhiddenをautoで作ってくれる様な拡張をしても良いかと思います。
 

実行

	public function postApply()
	{
		$data = array();
		$mailBodies = array();
		$data['title'] = 'test apply';
		// 
		if(!\Session::get(self::FORM_SESSION_KEY))
		{
			return \Redirect::to('test/form/');
		}
		// やり直しの場合は最初のフォームへ(入力値保持)
		if(\Input::get('_return'))
		{
			return \Redirect::to('test/form')->withInput();
		}
		// 保持したtokenを削除
		\Session::forget(self::FORM_SESSION_KEY);
		// 登録実行
		if(\Input::get('_apply'))
		{
			$mailBodies = array(
				'body' => \Input::get('body')
			);
			// メール送信
			\Mail::send('email.test', $mailBodies, function($message) {
				$message->to(Input::get('email'), 'test')->subject(\Input::get('title'));
			});
			
			return \View::make('test.apply', $data);
		}
	}
今回は入力されたアドレスにそのままメール送信する様に実装しました。
mailはdefaultでsmtpになっていると思いますので、実行環境に合わせてdriverを指定してください app/config/mail.php

前回と今回で、laravel4で実装するシンプルなフォームを紹介しました。
難しいものや、実装に時間のかかる様なものは一切ありませんので、色々実装してみてください。

about ytake

執筆に参加しています


Laravel お役立ち情報

share



このエントリーをはてなブックマークに追加

Categories

laravel 45

DTM 0

music 0

PHP全般 31

0

JAPAN 1

WORLD 1

javascript 4

RDBMS 1

NoSQL 1

NewSQL 1

Recent Posts

Ad

comments powered by Disqus

GitHub

Social Links

Author


クリエイティブ・コモンズ・ライセンス
Yuuki Takezawa 作『Ytake Blog』はクリエイティブ・コモンズ 表示 - 非営利 4.0 国際 ライセンス で提供されています。

© ytake/comnect All Rights Reserved. 2014