laravel はじめました
公式ドキュメントを購入したのは先月だったか。ようやくはじめた。
はじめて書いたコード
見よう見まねで書いたログインフォームがこれ。 action_login と action_dologin で同じものをviewに渡そうとゴニョゴニョしていますね。
controllers/auth.php
<?php class Auth_Controller extends Base_Controller { public function action_login() { $input = array('username' => ''); return View::make('auth.login') ->with('input', $input) ->with('errors', new Laravel\Messages()); } public function action_dologin() { $input = Input::all(); $rules = array( 'username' => 'required', 'password' => 'required', ); $validation = Validator::make($input, $rules); if ($validation->fails()) { return View::make('auth.login') ->with('input', $input) ->with('errors', $validation->errors); } return "authed!"; } }
views/auth/login.blade.php
{{ Form::open('auth', 'post') }} {{ Form::text('username', $input['username']) }} @if ($errors->has('username')) {{ $errors->first('username') }} @endif {{ Form::password('password') }} @if ( $errors->has('password')) {{ $errors->first('password') }} @endif {{ Form::submit() }} {{ Form::close() }}
書き直したコード
ドキュメントとかソースとか読み直して、書き直したのがこれ。action_login からバリデーション失敗時のコードがなくなりすっきりしました。
controllers/auth.php
<?php class Auth_Controller extends Base_Controller { public function action_login() { return View::make('auth.login'); } public function action_dologin() { $input = Input::all(); $rules = array( 'username' => 'required', 'password' => 'required', ); $validation = Validator::make($input, $rules); if ($validation->fails()) { return Redirect::back() ->with_input() ->with_errors($validation); } return "authed!"; } }
views/auth/login.blade.php
{{ Form::open('auth', 'post') }} {{ Form::text('username', Input::old('username')) }} {{ $errors->first('username') }} {{ Form::password('password') }} {{ $errors->first('password') }} {{ Form::submit() }} {{ Form::close() }}
わかったこと
バリデーションエラーで前のページに戻るときは、Redirect::back()
あわせて with_input(), with_errors() も使う
Input::old() で前回入力した値を得られる
そのために with_input() しておく
view に空の errors を渡す必要はない
Viewコンストラクタ で $this->date['errors'] = new Messages() している。
エラーメッセージのキーは errors とするのが laravel の流儀っぽい
バリデーションメッセージ表示は {{$errors->first('fieldname')}}
エラーがなければ何もしないから if いらない