0

我正在使用 Laravel 4 的类在整个应用程序中捕获 Sentry 异常,并使用该函数App::error将数据传递回模板。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

问题是,当您在尝试登录失败后刷新页面时,这些错误仍然存​​在,因此您会看到它们两次。第二次刷新,他们已经清除了。输入也是如此(用 传递withInput())。

如果在路由中(而不是在 中App:error)发现错误,则一切正常。我应该使用这些App::error方法手动清除存储的数据吗?

4

1 回答 1

0

我总是使用 Session::flash() 来显示错误。Flash 将(针对一个请求)将数据设置(并自动取消设置)到您的会话中。所以你可以去

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 回答