如果$ user-> save()失败,则在Laravel中取消密码重置

时间:2014-04-01 23:06:25

标签: php laravel

Reminder控制器的默认postReset()操作具有以下用于重置密码的代码:

$response = Password::reset($credentials, function($user, $password) 
{
    $user->password = Hash::make($password);
    $user->save();
});

如果save方法失败(由于任何原因),我想添加一个取消重置的条件。我的模型在save()事件上调用验证函数,因此如果字段不验证,$ user-> save()将返回false。

我已将代码修改为:

$response = Password::reset($credentials, function($user, $password) 
{
    $user->password = $password;

    # validate before password hashing
    if(!$user->validate()) {
        Redirect::back()->with('error', 'Validator failed');
        return false;
    }

    # hash password and try to save
    $user->password = Hash::make($password);
    if(!$user->save()) {
        Redirect::back()->with('error', 'Validator failed');
        return false;
    }
});

if (!$response) {
    return Redirect::back()->with('error', 'Validator failed');
}

但是我看到闭包的返回不会影响$ response变量......所以任何想法如何做到这一点?

2 个答案:

答案 0 :(得分:0)

用户保存并不意味着它将被验证(当然,如果您使用香草Laravel)。您需要在保存之前亲自验证用户,并在验证失败时重新定向错误,而不是保存失败。 I. e。你需要使用这样的代码:

if($validator->fails() || !$user->save())
{
    return Redirect::back()->with('error', 'Failed to save');
}

其中$validator是您的规则验证者的实例。

答案 1 :(得分:0)

根据neoascetic's comment,我已经能够通过抛出异常来解决这个问题:

try {
    $response = Password::reset($credentials, function($user, $password)
    {
        $user->password = Hash::make($password);
        if(!$user->save()) {
            # throw exception if save fails
            throw new Exception(Password::INVALID_PASSWORD);
        }
    });
} catch ( Exception $e) {
    $response = Password::INVALID_PASSWORD;
}