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フィルターを使用しましょう。

参照:Laravelでインプットフィルター

Input::only()は配列で項目を返しますから、array_map()で各要素にtrim()を実行します。そのままでは、ページの表示に反映されませんので、Input::replace()を使い、入力に書き戻してやります。

Userモデル

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