LoginSignup
48

More than 5 years have passed since last update.

Laravel5 Bladeで簡単なForm

Last updated at Posted at 2015-04-09

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

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=""としておけばいいのだけど。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
48