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()でセッションの後片付けなど、ひと通り行なってくれます。