前回は、ブラウザからデータベーステーブルを作成しました。今回は、その作成したデータベーステーブルに新規データを登録したいと思います。
ビューの作成
まず、新規データ作成するためのビューファイルを作成します。
app/resources/gathers/create.blade.php
@extends('app') @section('content') <div class="container"> <h2>新規作成</h2> <form class="form-horizontal" method="POST"> <div class="form-group"> <label for="name" class="col-sm-2 control-label">名前</label> <div class="col-sm-10"> <input type="text" class="form-control" id="name" name="name"> </div> </div> <div class="form-group"> <label for="code" class="col-sm-2 control-label">Code</label> <div class="col-sm-10"> <input type="text" class="form-control" id="code" name="code"> </div> </div> <div class="form-group"> <label for="description" class="col-sm-2 control-label">説明</label> <div class="col-sm-10"> <input type="text" class="form-control" id="description" name="description"> </div> </div> <div class="form-group"> <div class="col-sm-10"> <input type="submit" value="新規作成" class="btn btn-primary"> </div> </div> <input type="hidden" name="_token" value="{{ csrf_token()}}"> </form> </div> @endsection
29行目:CSRF(クロスサイトリクエストフォージェリ)攻撃対策として、隠し要素で_tokenを送信します。Laravel5では、デフォルトでCSRF対策がMiddlewareに設定されていますので、この1行がなければエラーになります。
FormとHTMLヘルパーを使用する
Laravel5から、FormとHTMLヘルパーが標準に含まれなくなりましたので、上記のような書き方になっていますが、FormとHTMLヘルパーを使用した方が簡単なので、composer.jsonのrequiareセクションに下記の3行目を追加します。
"require": { "laravel/framework": "5.0.*", "laravelcollective/html": "~5.0" },
上記を追加したら、config/app.phpを編集し、providers配列の138行目あたりに下記の行を追加します。
'Collective\Html\HtmlServiceProvider',
そしてaliases配列の195行目あたりに下記の2行を追加します。
'Form' => 'Collective\Html\FormFacade', 'Html' => 'Collective\Html\HtmlFacade',
最後にcomposer updateを実行すれば、FormとHTMLヘルパーが使用できるようになります。
Bladeタグによるフォーム
それでは、上記フォームをBladeタグを使用して記述してみます。
app/resources/gathers/create.blade.php
@extends('app') @section('content') <div class="container"> <h2>新規作成</h2> {!! Form::open(["class"=>"form-horizontal"]) !!} <div class="form-group"> {!! Form::label("name","名前",["class"=>"col-sm-2 control-label"]) !!} <div class="col-sm-10"> {!! Form::text("name","",["class"=>"form-control"]) !!} </div> </div> <div class="form-group"> {!! Form::label("code","Code",["class"=>"col-sm-2 control-label"]) !!} <div class="col-sm-10"> {!! Form::text("code","",["class"=>"form-control"]) !!} </div> </div> <div class="form-group"> {!! Form::label("description","説明",["class"=>"col-sm-2 control-label"]) !!} <div class="col-sm-10"> {!! Form::text("description","",["class"=>"form-control"]) !!} </div> </div> <div class="form-group"> <div class="col-sm-10"> {!! Form::submit("新規作成",["class"=>"btn btn-primary col-sm-offset-2"]) !!} </div> </div> {!! Form::close() !!} </div> @endsection
Laravel5では、デフォルトでもセキュリティを強化するために、{{...}}と{{{...}}}のBlade記法での出力はエスケープされるようになりました。ですので、出力をエスケープせずにそのまま表示するには、{!! ... !!}記法を使用する必要があります。
尚、{!! Form::open() !!}で記述した場合、隠し要素(hidden)の_tokenは自動生成されますので、csrf_token()の入力忘れがありません。
コントローラの生成
次にControllerを作成します。コマンドプロンプトから、下記のように入力します。
cd C:\xampp\htdocs\laravel php aritsan make:controller GathersController
そして、生成されたコントローラーをルーターで登録します。
app/Http/route.php
Route::controller("gathers","GathersController");
生成されたコントローラーのcreateアクションをgetCreateに変更して、下記のように入力します。
app/Http/Controllers/GathersController.php
publicn function getCreate(){ return view("gathers.create"); }
これで、ブラウザからlocalhost/laravel/public/gathers/createと入力すると、下記のように表示されます。
受信データの確認
GathersControllerにpostCreateを下記にように作成して、受信データを確認します。
public function postCreate(){ return var_dump(\Input::all()); }
必ず、\Input::all()と記述してください。Laravel4では、Input::all()でも大丈夫でしたが、Laravel5では、名前空間が必須ですので、Inputクラスの先頭に\を入力する必要があります。
下記のようにデータを受信することができます。
["_token"]データが自動的に添付されたのが確認できると思います。
バリデーション
次にこのままでは、上記のように空白のままでもデータを受信してしまいますので、バリデーションでnameとcodeを必須項目にしてみたいと思います。
postCreateを下記のように修正します。
app/Http/Controllers/GathersController.php
public function postCreate(Request $request){ $val=\Validator::make($request->all(),[ 'name'=>'required', 'code'=>'required', ]); if($val->fails()){ return redirect()->back()->withErrors($val->errors()); } }
ビューファイルの上の方にエラー表示するように下記を追加してください。
@if($errors->all()) @foreach($errors->all() as $error) <p class="alert alert-danger"> {{ $error }} </p> @endforeach @endif
name項目とcode項目に何も入力しないで送信すると下記のように表示されます。
本日はここまでにします。次回は、受信したデータをデータベーステーブルに登録します。
本日のポイント
- ビューファイルには必ず隠しフィールドで、_tokenデータを送信する
- Laravel5では、FormとHTMLヘルパーは標準装備されていないので、必要ならインストールする
- Bladeタグはデフォルトで全ての出力をエスケープされるように仕様が変更になっている
- エスケープしない場合は{!! ... !!}タグを使用する
- {!! Form::open() !!}でフォームを生成すると、自動的にCSFRトークンデータは生成される
- ※コントローラメソッドでもタイプヒントによる依存指定ができるようになった
- コントローラで、ファサードクラスを使用するには、先頭に\を付与する
- 又は、use演算子で事前にインポートする
- use Validatorでインポートしておけばメソッド内でValidator::makeで使用できる
- Redirect::to()の代わりに、redirect()ヘルパーを使用する(推奨)
次回は、作成した新規データをデータベーステーブルに保存します。