0

Laravel 4 のApp::errorクラスを使用して、アプリケーション全体で Sentry 例外をキャッチし、withErrors()関数を使用してデータをテンプレートに戻しています。

簡単なルート:

routes.php

Route::post('/login...

...

$credentials = array(
    'email'    => Input::get('email'),
    'password' => Input::get('password') 
);

$user = Sentry::authenticate($credentials);

// Exception thrown...

次に、例外をキャッチします。

exceptions.php

App::error(function(Cartalyst\Sentry\Users\WrongPasswordException $e) {
    return Redirect::back()->withErrors(array('failed' => 'Email or password is incorrect'))->withInput();
});

ビューで:

/views/login/login.blade.php

@if ($errors->has('failed'))
    <strong>{{ $errors->first('failed') }}</strong>
@endif

問題は、ログインに失敗した後にページを更新すると、これらのエラーが持続するため、エラーが 2 回表示されることです。もう一度更新すると、クリアされました。入力についても同様です ( で渡されますwithInput())。

エラーが ( ではなくApp:error) ルート内で検出された場合、すべて正常に機能します。App::errorメソッドを使用して、保存されたデータを手動で消去する必要がありますか?

4

1 に答える 1

0

私は常に Session::flash() を使用してエラーを表示します。Flash は (1 つの要求に対して) セッションにデータを設定 (および自動的に設定解除) します。だからあなたは次のように行くことができます

App::error(function(Cartalyst\Sentry\Users\WrongPasswordException $e) {
    Session::flash('error', 'Email or password is incorrect.');
    return Redirect::back()->withInput();
});

あなたの見解でこれをキャッチしてください:

@if($message = Session::get('success'))
    <div class="alert-box success">
        {{ $message }}
    </div>
@endif

@if($message = Session::get('error'))
    <div class="alert-box alert">
        {{ $message }}
    </div>
@endif

関連するメモとして、次のような通常の try-catch 表記に従うことをお勧めします。

try {
    // do things that might throw an Exception here...  

} catch(Cartalyst\Sentry\Users\UserExistsException $e) {
    // catch the Exception...

    Session::flash('error', Lang::get('register.user_already_exists'));
    return Redirect::action('RegisterController@getIndex')->withInput();

}

...現在行っていることApp::error()は、おそらくそれよりも少し面倒だからです。

于 2013-05-20T21:32:20.670 に答える