いちおうマスターレイアウト。
resources/views/master.blade.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
@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 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
Route::get('input','HogeController@input');
Route::post('res','HogeController@res');
###簡単なValidation
Laravel5からはFormRequestがあるので、それが使えるならそのほうがいいのだけど、WebAPIのValidationとかはでは、従来のバリデーションのほうが良い場合もある。
####バリデーションの記述
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で回したり。
@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)
バリデーションがエラーで戻った時に値を保持しておきたい。そんな時は、
return redirect()->back()->withErrors($validation->errors())->withInput();
リダイレクトのおしりに->withInput()をつけておく。View側では、Input::old()で受ける。
name:<input type="text" name="name" value="{{Input::old('name')}}"><br>
などと、valueにしこむ。
なお、パスワードなど、表示したくない(戻したくない)ものは、
->withInput(Input::except('password'));
といったことができるようだ。そもそもvalue=""としておけばいいのだけど。