Laravel check for constraint violation

后端 未结 5 2138
野的像风
野的像风 2021-02-05 11:15

I was curious if there is a way we can check if there is a constraint violation error when delete or insert a record into the database.

The exception thrown is called \'

5条回答
  •  天命终不由人
    2021-02-05 12:14

    If you are using Laravel version 5 and want global exception handling of specific cases you should put your code in the report method of the /app/Exception/Handler.php file. Here is an example of how we do it in one of our micro services:

    public function render($request, Exception $e)
    {
        $response   = app()->make(\App\Support\Response::class);
        $details = $this->details($e);
    
        $shouldRenderHttp = $details['statusCode'] >= 500 && config('app.env') !== 'production';
        if($shouldRenderHttp) {
            return parent::render($request, $e);
        }
    
        return $response->setStatusCode($details['statusCode'])->withMessage($details['message']);
    }
    
    protected function details(Exception $e) : array
    {
        // We will give Error 500 if we cannot detect the error from the exception
        $statusCode = 500;
        $message = $e->getMessage();
    
        if (method_exists($e, 'getStatusCode')) { // Not all Exceptions have a http status code
            $statusCode = $e->getStatusCode();
        } 
    
        if($e instanceof ModelNotFoundException) {
            $statusCode = 404;
        }
        else if($e instanceof QueryException) {
            $statusCode = 406;
            $integrityConstraintViolation = 1451;
            if ($e->errorInfo[1] == $integrityConstraintViolation) {
                $message = "Cannot proceed with query, it is referenced by other records in the database.";
                \Log::info($e->errorInfo[2]);
            }
            else {
                $message = 'Could not execute query: ' . $e->errorInfo[2];
                \Log::error($message);
            }
        }
        elseif ($e instanceof NotFoundHttpException) {
            $message = "Url does not exist.";
        }
    
        return compact('statusCode', 'message');
    }
    

    The Response class we use is a simple wrapper of Symfony\Component\HttpFoundation\Response as HttpResponse which returns HTTP responses in a way that better suits us.

    Have a look at the documentation, it is straightforward.

提交回复
热议问题