WinRoadのLaravel4初心者講座

次世代PHPフレームワークのLaravel4を初心者向けに解説して参ります。

Winroad徒然草の管理人がお届けします
try~catch構文でログイン処理

try~catch構文でログイン処理

このエントリーをはてなブックマークに追加

Sentry2のドキュメントにあるように、try~catch構文でログイン処理する方法を調べてみたいと思います。

  1. try~catch構文は、PHP5.0以降に採用された構文で例外処理を行います。tryで例外の発生する可能性のあるロジックを記述し、例外を捕捉したら、発生した例外に応じてcatch以降のロジックを実行します。
  2. 下記にpostIndex()を記述します。
    laravel/app/controllers/LoginController.php

    public function postIndex(){
     try{
     //フォームからemailとpasswordの連想配列を取得
     $login=Input::only('email','password');
     //ログインの実行
     $user=Sentry::authenticate($login,Input::get('remember'));
     //ログイン後トップページへリダイレクト
     return Redirect::to('/');
     }
     //例外を捕捉したら
     catch (Cartalyst\Sentry\Users\LoginRequiredException $e){
     //元のページへリダイレクト
     return Redirect::back()
     ->withErrors(array('warning'=>'E-mailとパスワードを入力して下さい'))
     ->withInput();
     }
     catch (Cartalyst\Sentry\Users\PasswordRequiredException $e){
     return Redirect::back()
     ->withErrors(array('warning'=>'パスワードを入力して下さい'))
     ->withInput();
     }
     catch (Cartalyst\Sentry\Users\UserNotActivatedException $e){
     return Redirect::back()
     ->withErrors(array('warning'=>'アクティベートされていません'))
     ->withInput();
     }
     catch (Cartalyst\Sentry\Users\UserNotFoundException $e){
     return Redirect::back()
     ->withErrors(array('warning'=>'該当者がいません'))
     ->withInput();
     }
     }
    • 6行目:Sentry::authenticate()メソッドで認証を行います。第1引数に、認証するための情報(emailとpassoword)を指定します。第2引数には、ログイン状態を保持するかどうかをtrue又は、falseで指定します。
    • 6行目:Input::get()メソッドで受け取った値を第2引数に指定しています。checkboxにチェックを入れていれば下記のようにブラウザにcartalyst_sentry名のクッキー(有効期限:5年間)を保存します。
      laravel012
    • 8行目:ログイン後にトップページへ移動します。
    • 11行目:必須ログイン情報が無かったら、元のページ(ログインページ)へ移動します。
    • 14-15行目:エラー情報と入力値を保持したままリダイレクトします。
    • 17行目:パスワードが入力されていなかったら、元のページへリダイレクトします。
    • 22行目:emailとパスワードが一致していてもアクティベートされていなければ、元のページへリダイレクトします。アクティベートされていない場合は、元のページでは無く、別のページを用意しておいた方がいいかもしれませんね。
    • 27行目:ユーザーが見つからなかった場合に、元のページへリダイレクトします。
  3. ビューファイルを下記のように修正します。
    laravel/app/views/login/index.blade.php

    <!doctype html>
     <html>
     <head>
     <meta charset="utf-8">
     <title>Login</title>
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     {{HTML::style('tbs/css/bootstrap.min.css')}}
     {{HTML::style('tbs/css/signin.css')}}</head>
    <body>
    <div class="container">
     {{Form::open(array('url'=>'login/index','class'=>'form-signin'))}}
     <h2 class="form-signin-heading">会員専用サイト</h2>
     {{Form::text('email','',array('class'=>'form-control','placeholder'=>'E-mail'))}}
     {{Form::password('password',array('class'=>'form-control','placeholder'=>'Password'))}}
     @if($errors->has('warning'))
     <div class="alert alert-danger">
     {{$errors->first('warning')}}
     </div>
     @endif
     {{Form::checkbox('remember',1,true)}} ログイン状態を保持する<br><br>
     {{Form::submit('ログイン',array('class'=>'btn btn-lg btn-primary btn-block'))}}
     {{Form::close()}}
    </div> <!-- /container -->
    </body>
     </html>
    • 修正(追加)箇所は、15-19行目です。
    • エラーがあった場合、下記のように入力フィールドの下にエラー文字を表示します。
    • 尚、Sentry2では、コントローラでwithInput()を指定して、リダイレクトすると、ビューファイルは何も変更せずに、元の入力値を表示します。つまり、Form::text()メソッドの第2引数に、Input::old(‘email’)を記述しなくても元の入力値を表示します。
      laravel013
  4. emailとpasswordが一致した場合、トップページへ移動します。
  5. 尚、このままでは、只単にユーザー認証して、トップページへ移動しただけです。認証機能を使うためには、認証していない人は、指定のページへアクセスできないようにしなければなりません。
  6. 次回は、認証していない人は指定のページへアクセスできないようにフィルターをかける方法を調べてみたいと思います。

« »

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です