Laravel:ログイン・ログオフ3(フォームの処理)
タグ: Laravel3
フォームの内容を受け取り、ログインしましょう。
フォームの処理
application/routes.php
に以下のコードを追加します。
Route::post('login', function() { // バリデーションルール $rules = array( 'username' => 'required|alpha_dash', 'password' => 'required', ); $inputs = Input::only(array('username', 'password')); $val = Validator::make($inputs, $rules); if ( $val->passes() ) { // バリデーション通過 if ( Auth::attempt($inputs) ) { // ログイン成功 return Redirect::home(); } else { // ログイン失敗 return Redirect::back() ->with_input() ->with('warning', 'ユーザー名とパスワードを正しく指定してください。'); } } else { // バリデーション失敗 return Redirect::back() ->with_input() ->with_errors($val->errors); } });
Input::only()
を使用し、バリディーションに必要な項目のみを$inputs
に受け取っています。
ログインフォームではテーブルの追加などはありませんが、レコードの追加や更新処理がある場合、余計な項目を渡すとSQLのプレースホルダーと数が合わないとエラーになってしまいます。そんな時は更に$inputs = array_only($input, array(必要項目を列挙));
とヘルパーを使用することで、スマートに記述できます。
Laravelでは入力項目の加工はしません。trimなどをバリデーションに使用できません。必要であれば、以下のコードで対応できます。
$inputs = array_map('trim', Input::only(array('username', 'password'))); Input::replace($inputs);
もし、全入力をtrimする必要があるのでしたら、before
フィルターを使用しましょう。
Input::only()
は配列で項目を返しますから、array_map()
で各要素にtrim()
を実行します。そのままでは、ページの表示に反映されませんので、Input::replace()
を使い、入力に書き戻してやります。
Userモデル
application/models
にuser.php
を作成します。
<?php class User extends Eloquent { public static $timestamps = true; public function set_password($password) { $this->set_attribute('password', Hash::make($password)); } }
$timestamps
にtrueを設定することで、作成・更新時間が自動的にアップデートされます。トラブった時に更新日時は役に立ちますので、容量に問題がなければ、付けておきましょう。
set_passwordはパスワードのセッターです。Userモデルのpassword
への代入を行うと、自動的にハッシュをかけるコードになっています。ハッシュし忘れを防ぐために、入れておきます。
せっかくUserモデルを作成したので、ユーザーを追加しましょう。今回はユーザー追加のページを作成しません。次のコードをroutes.php
に作成し、/add
へブラウザからアクセスしてください。
Route::get('add', function() { $user = new User; $user->username = 'oyabun'; $user->password = 'kobun'; $user->email = 'kyoudai@sinseki.com'; $user->save(); return '追加しました'; });
テスト
/login
へアクセスしテストしてください。一度ログインした後で、もう一度/login
しようとすると、ログイン済みだと叱られます。では、ログアウトルートも作成しましょう。
Route::get('logout', function() { Auth::logout(); return Redirect::home(); });
Auth::logout()でセッションの後片付けなど、ひと通り行なってくれます。