Laravel5 Bladeで簡単なForm


いちおうマスターレイアウト。

resources/views/master.blade.php

```php
<!doctype>
<html>
<head>
	<meta charset="utf-8">
	<title>
		@yield('title')
	</title>
</head>
<body>
 @yield('body')
</body>
</html>
```

Lavaral5からはHtmlファサードとか標準で読み込まれないので、使わないことにする（Helperとかほとんどメリットないので）。
ポイントは、普通のフォームでもname='_token'でcsrf_token()を送るところ。
ここでは、/public/res/というURLにpostする。

resources/views/input.blade.php

```html
@extends('master')

@section('title')
input
@stop

@section('body')
<form action="res" method="post">
<input type="input" name="name">
<input type="input" name="email">
<input type="input" name="password">
<input type="submit" value="SEND">
<input type="hidden" name="_token" value="{{csrf_token()}}">
</form>
@stop
```

受取については、Request経由か、Laravel5からはFormRequestを使うのが良いのだろうけど、とりあえずInputで受け取る。Inputを利用するには、use Input;とする必要がある。
ここでは、/inputでFormを表示、/resで値を受取、表示する。

app/Http/Controllers/HogeController.php

```php
<?php namespace App\Http\Controllers;

use App\Http\Controllers\Controller;
use Input;

class HogeController extends Controller{

	public function input(){
		return view('input');
	}

	public function res(){

		$name = Input::get('name');
		$email = Input::get('email');
		$password = Input::get('password');

		return $name." ".$email;
	}

}
```

一応Routeも。

app/Http/route.php

```php
Route::get('input','HogeController@input');
Route::post('res','HogeController@res');
```

###簡単なValidation

Laravel5からはFormRequestがあるので、それが使えるならそのほうがいいのだけど、WebAPIのValidationとかはでは、従来のバリデーションのほうが良い場合もある。

####バリデーションの記述

```php
public function res()
	{
		
		$input = Input::all();
		
		// $input = [
		// 	'name'=>Input::get('name'),
		// 	'email'=>Input::get('email'),
		// 	'password'=>Input::get('password'),
		// ];

		$rules = [
			'name'=>'required',
			'email'=>'required',
			'password'=>'required'
		];

		$messages = [
			'name.required'=>'名前は必須です。',
			'email.required'=>'emailは必須です。',
			'password.required'=>'passwordは必須です。',
		];
	
		//評価。$messageは省くこともできる。
		$validation = Validator::make($input,$rules,$messages);
		
		//エラーだったら
		if($validation->fails()){
			//元のページに戻す
			return redirect()->back()->withErrors($validation->errors());
		}

		return "OK";
	}
```

####元のページでのエラー表示

$errorsで取得できる。あとは、firstで表示したり、loopで回したり。

```html
@extends('master')

@section('title')
test
@stop

@section('body')
<h3>input</h3>
<form action="create" method="post">
name:<input type="text" name="name"><br>
email:<input type="text" name="email"><br>
password:<input type="text" name="password"><br>
<input type="hidden" name="_token" value="{{csrf_token()}}">
<input type="submit" value="SEND">
</form>
{{$errors->first('name')}}
{{$errors->first('email')}}
{{$errors->first('password')}}
@stop
```

loopは

```
@foreach ($errors->all() as $error)
       {{ $error }}<br>
@endforeach
```
こんな感じ（未検証）。

####Formの値を保持（old）

バリデーションがエラーで戻った時に値を保持しておきたい。そんな時は、

```php
return redirect()->back()->withErrors($validation->errors())->withInput();
```

リダイレクトのおしりに->withInput()をつけておく。View側では、Input::old()で受ける。

```php
name:<input type="text" name="name" value="{{Input::old('name')}}"><br>
```
などと、valueにしこむ。
なお、パスワードなど、表示したくない（戻したくない）ものは、

```php
->withInput(Input::except('password'));
```
といったことができるようだ。そもそもvalue=""としておけばいいのだけど。