Laravel 完整性约束错误未在控制器中返回 JSON

Posted

技术标签:

【中文标题】Laravel 完整性约束错误未在控制器中返回 JSON【英文标题】:Laravel Integrity constraint error not returning JSON in controller 【发布时间】:2017-01-12 05:20:22 【问题描述】:

我正在学习 Laravel 以创建一个宁静的 API。以下代码当前正在与 Users 表对话并在其中创建新记录。但是,当重复的电子邮件请求到达数据库时,我认为会被捕获的异常(返回 JSON 错误)不是,而是我得到一个 Laravel 异常,它似乎是一个更深层次的“QueryException”应用程序。

消息如下:

QueryException in Connection.php line 761:
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'email' in ....

我如何才能最好地在我的应用程序中捕获此错误并返回 Json 响应而不是 Laravel 响应?我错过了一些明显的东西吗?

namespace App\Http\Controllers\Api;

use Illuminate\Http\Request;
use App\User as User;
use JWTAuth;
use Response;
use App\Http\Controllers\Controller;

class LoginController extends Controller

  public function __construct(Request $request)
        $this->request = $request;
  

  public function signup()
  
    $email = $this->request->input('email');
    $password = $this->request->input('password');
    $credentials['email'] = $email;
    $credentials['password'] = $password;
    $credentials['name'] = 'Name';

    try 
         $user = User::create($credentials);
     catch (Exception $e) 
        return Response::json(['error' => 'User already exists.'], HttpResponse::HTTP_CONFLICT);
    

    $token = JWTAuth::fromUser($user);
    return Response::json(compact('token'));
  



【问题讨论】:

试试catch (\Exception $e) @ka_lin - 这是什么巫术?这行得通:) 你能详细说明这里发生了什么吗? 【参考方案1】:

您应该将 catch (Exception $e) 更改为 catch (\Exception $e)

因为你当前的命名空间是App\Http\Controllers\Api;

PHP 尝试捕获名称为 App\Http\Controllers\Api\Exception; 的异常 - 这显然不存在。

要转义当前命名空间并捕获本机异常,您需要一个反斜杠\Exception - 这是它的完整限定符名称。

或者,您可以像任何其他库或smth一样在脚本顶部添加...use \Exception as Exception;

【讨论】:

以上是关于Laravel 完整性约束错误未在控制器中返回 JSON的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:正确保存后返回重定向抛出 SQLSTATE [23000]:完整性约束违规

SQLSTATE[23000]:违反完整性约束:在 Laravel 5.2 中

Laravel 7 错误 - SQLSTATE [23000]:完整性约束违规:1048 列 'first_name' 不能为空

Laravel 外键约束报错

完整性约束违规:1048 Column 'user_id' cannot be null 分配角色时发生错误(Laravel 5.3)

SQLSTATE [23000]:违反完整性约束:4025 CONSTRAINT