Eloquent-oauth - 捕获PDO异常

时间:2015-07-28 01:37:47

标签: php oauth error-handling laravel-5

虽然这个问题是关于一个特定的软件包,但它应该与其他软件包相关,因为它实际上是关于Laravel框架中正确陷入以下情况的位置。

我正在使用eloquent-oauth启用通过linkedin和Facebook登录我的应用程序。

授权和登录都可以单独处理。

但是,如果我之前已通过一个社交平台授权并登录,然后尝试使用另一个社交平台进行授权,则会收到一个PDO异常,即插入在我的用户表上的唯一电子邮件约束上失败。

我应该在哪里捕获插入?

我可以看到我可以直接在供应商文件夹中添加代码,但是不要认为这是一种很好的做法,因为如果我在将来某个时候升级软件包肯定会被覆盖?

我目前正在做的是将用户检查添加到登录功能中的vendor / adamwathan / eloquent-oauth / src / OAuthManager.php文件中

public function login($providerAlias, Closure $callback = null)
{
    if (! $this->stateManager->verifyState()) 
    {
        throw new InvalidAuthorizationCodeException;
    }
    $details = $this->getProvider($providerAlias)->getUserDetails();

    //start of existing user check
    $thisUser = User::where('email', $details->email)->first();
    if ($thisUser !== null)
        {
            $autoOpenModalLogin = true; //instruct the page to open the login modal
            return redirect()->guest('home')->with('$autoOpenModalLogin', $autoOpenModalLogin);
        }
    //end of existing user check
    return $this->authenticator->login($providerAlias, $details, $callback);
}

我认为将它添加到某个地方的路线可能会更好 - 但我似乎无法捕获该错误。我是否应该在下面添加其他内容来捕获PDO错误?

Route::get('{provider}/login', function ($provider) {
try {
    OAuth::login($provider, function ($user, $userDetails) {
    $user->email = $userDetails->email;
    $user->name = $userDetails->firstName . ' ' . $userDetails->lastName;
    $user->first_name = $userDetails->firstName;
    $user->last_name = $userDetails->lastName;
    $user->save();
    });
    return view('home');
} catch (ApplicationRejectedException $e) {
    // User rejected application
} catch (InvalidAuthorizationCodeException $e) {
    // Authorization was attempted with invalid
    // code,likely forgery attempt
}
});

我想如果我保留插入的用户检查供应商文件,我只需更新那些,如果我更新包?

但有没有比我做的更好的方法呢?

1 个答案:

答案 0 :(得分:0)

好的,所以我添加了一个PDOexception的catch,这似乎正是我需要的!先检查一下,然后在这里确认。

Route::get('{provider}/login', function ($provider) {
try {
    OAuth::login($provider, function ($user, $userDetails) {
    $user->email = $userDetails->email;
    $user->name = $userDetails->firstName . ' ' . $userDetails->lastName;
    $user->first_name = $userDetails->firstName;
    $user->last_name = $userDetails->lastName;
    $user->save();
    });
    return view('home');
} catch (ApplicationRejectedException $e) {
// User rejected application
} catch (InvalidAuthorizationCodeException $e) {
// Authorization was attempted with invalid
// code,likely forgery attempt
}

catch(PDOException $e){
    $autoOpenModalLogin = true;
    return redirect()->guest('home')->with('$autoOpenModalLogin', $autoOpenModalLogin);
}   
});