虽然这个问题是关于一个特定的软件包,但它应该与其他软件包相关,因为它实际上是关于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
}
});
我想如果我保留插入的用户检查供应商文件,我只需更新那些,如果我更新包?
但有没有比我做的更好的方法呢?
答案 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);
}
});