>  기사  >  PHP 프레임워크  >  laravel 요청 예외 처리

laravel 요청 예외 처리

王林
王林원래의
2023-05-26 16:35:071326검색

Laravel은 웹 애플리케이션 구축을 위한 강력하고 유연한 시스템을 제공하는 인기 있는 PHP 프레임워크입니다. 그러나 개발 과정에서 요청 예외가 발생하는 것은 불가피합니다. 이 글에서는 Laravel 요청 예외를 처리하는 방법에 대해 설명합니다.

  1. 예외 분류

Laravel의 요청 예외는 프로그램 예외와 HTTP 예외의 두 가지 유형으로 나눌 수 있습니다.

프로그램 예외는 PHP에서 발생한 치명적인 오류, 포착되지 않은 예외 등 코드가 실행될 때 발생하는 예외입니다.

HTTP 예외는 404 찾을 수 없음, 500 내부 서버 오류 등 HTTP 요청에서 발생하는 예외를 의미합니다.

다른 유형의 예외에는 다른 처리 방법이 필요합니다.

  1. 프로그램 예외 처리

프로그램 예외가 Laravel 컨트롤러에 나타날 수 있습니다. 처리하지 않으면 오류 메시지를 표시하는 페이지가 나타납니다. 이는 사용자가 보기를 기대하는 것이 아니므로 프로그램 예외를 처리해야 합니다.

Laravel은 프로그램 예외를 처리하는 두 가지 방법을 제공합니다. 첫 번째는 예외 처리기를 사용하는 것이고, 두 번째는 전역 예외 처리를 사용하는 것입니다.

2.1 예외 처리기

Laravel 예외 처리기는 애플리케이션에서 발생한 예외를 처리하는 클래스입니다. 예외가 발생했을 때 컨트롤러가 JSON 형식으로 응답을 반환하도록 하려면 사용자 지정 예외 처리기를 만들 수 있습니다. 예는 다음과 같습니다.

<?php

namespace AppExceptions;

use Exception;
use IlluminateFoundationExceptionsHandler as ExceptionHandler;

class Handler extends ExceptionHandler
{
    /**
     * A list of the exception types that are not reported.
     *
     * @var array
     */
    protected $dontReport = [
        //
    ];

    /**
     * Report or log an exception.
     *
     * @param  Exception  $exception
     * @return void
     */
    public function report(Exception $exception)
    {
        parent::report($exception);
    }

    /**
     * Render an exception into an HTTP response.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Exception  $exception
     * @return IlluminateHttpResponse
     */
    public function render($request, Exception $exception)
    {
        if ($exception instanceof IlluminateDatabaseEloquentModelNotFoundException) {
            return response()->json([
                'error' => 'Resource not found'
            ], 404);
        }

        return parent::render($request, $exception);
    }
}

이 예에서는 Laravel의 예외 처리기 클래스를 상속하고 render 메서드를 재정의합니다. render 메소드에서 예외 유형이 IlluminateDatabaseEloquentModelNotFoundException인지 확인합니다. 그렇다면 JSON 형식의 응답을 반환합니다. render 方法。在 render 方法中,我们检查了异常类型是否是 IlluminateDatabaseEloquentModelNotFoundException。如果是,我们返回一个 JSON 格式的响应。

我们还可以在这个方法中处理其他的程序异常。这种处理方式的好处是,我们可以为每种类型的异常编写自定义的处理器。这样我们就能够预测到我们会得到什么样的响应。

2.2 全局异常处理

使用全局异常处理,我们可以捕获应用程序中的所有异常,而不是为每种异常编写单独的处理器。下面是一个例子:

<?php

namespace AppExceptions;

use Exception;
use IlluminateFoundationExceptionsHandler as ExceptionHandler;

class Handler extends ExceptionHandler
{
    /**
     * A list of the exception types that are not reported.
     *
     * @var array
     */
    protected $dontReport = [
        //
    ];

    /**
     * Report or log an exception.
     *
     * @param  Exception  $exception
     * @return void
     */
    public function report(Exception $exception)
    {
        parent::report($exception);
    }

    /**
     * Render an exception into an HTTP response.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Exception  $exception
     * @return IlluminateHttpResponse
     */
    public function render($request, Exception $exception)
    {
        if ($exception instanceof SymfonyComponentHttpKernelExceptionHttpException) {
            $code = $exception->getStatusCode();

            return response()->json([
                'error' => 'HTTP Exception',
                'status' => $code
            ], $code);
        }

        return parent::render($request, $exception);
    }

    /**
     * Render the given HttpException.
     *
     * @param  SymfonyComponentHttpKernelExceptionHttpException  $e
     * @return IlluminateHttpResponse
     */
    protected function renderHttpException(HttpException $e)
    {
        $status = $e->getStatusCode();

        if (view()->exists("errors.{$status}")) {
            return response()->view("errors.{$status}", ['exception' => $e], $status, $e->getHeaders());
        } else {
            return $this->convertExceptionToResponse($e);
        }
    }
}

在这个例子中,我们重写了 render 方法,检查异常类型是否是 SymfonyComponentHttpKernelExceptionHttpException。如果是,我们创建了一个 JSON 格式的响应,包括错误消息和 HTTP 状态码。

如果我们需要呈现 HTML 页面,我们还可以重写 renderHttpException 方法,以渲染自定义的异常页面。

  1. HTTP 异常的处理

Laravel 提供了一种简单的方法处理 HTTP 异常。通过自定义 app/Exceptions/Handler.php 中的 render 方法,我们可以返回指定的 HTTP 状态码。以下是一个例子:

public function render($request, Exception $exception)
{
    if ($this->isHttpException($exception)) {
        return $this->renderHttpException($exception);
    } else {
        return parent::render($request, $exception);
    }
}

protected function renderHttpException(HttpException $exception)
{
    return response()->view('errors.' . $exception->getStatusCode(), [], $exception->getStatusCode());
}

在上面的例子中,我们检查异常是否是 HTTP 异常。如果是,我们使用 getStatusCode 方法获取 HTTP 状态码,并将其用作视图名称。在这个例子中,我们只是返回了一个对应状态码的视图。

  1. 结论

在本文中,我们介绍了 Laravel 中程序和 HTTP 异常的处理方法。我们学习了如何使用异常处理器和全局异常处理来处理程序异常,以及如何自定义 render

이 방법으로 다른 프로그램 예외도 처리할 수 있습니다. 이 접근 방식의 장점은 각 예외 유형에 대해 사용자 정의 핸들러를 작성할 수 있다는 것입니다. 이런 식으로 우리는 어떤 종류의 반응을 얻게 될지 예측할 수 있습니다. 🎜🎜2.2 전역 예외 처리🎜🎜전역 예외 처리를 사용하면 각 예외에 대해 별도의 처리기를 작성하는 대신 애플리케이션에서 모든 예외를 포착할 수 있습니다. 예는 다음과 같습니다. 🎜rrreee🎜이 예에서는 render 메서드를 재정의하여 예외 유형이 SymfonyComponentHttpKernelExceptionHttpException인지 확인합니다. 그렇다면 오류 메시지와 HTTP 상태 코드를 포함하는 JSON 형식의 응답을 생성합니다. 🎜🎜HTML 페이지를 렌더링해야 하는 경우 renderHttpException 메서드를 재정의하여 사용자 정의 예외 페이지를 렌더링할 수도 있습니다. 🎜
    🎜HTTP 예외 처리🎜🎜🎜Laravel은 HTTP 예외를 처리하는 간단한 방법을 제공합니다. app/Exceptions/Handler.php에서 render 메서드를 사용자 정의하면 지정된 HTTP 상태 코드를 반환할 수 있습니다. 예는 다음과 같습니다. 🎜rrreee🎜위 예에서는 예외가 HTTP 예외인지 확인합니다. 그렇다면 getStatusCode 메소드를 사용하여 HTTP 상태 코드를 가져와서 뷰 이름으로 사용합니다. 이 예에서는 상태 코드에 해당하는 뷰만 반환합니다. 🎜
      🎜결론🎜🎜🎜이 글에서는 Laravel에서 프로그램 및 HTTP 예외를 처리하는 방법을 소개했습니다. 우리는 예외 처리기와 전역 예외 처리를 사용하여 프로그램 예외를 처리하는 방법과 render 메서드를 사용자 정의하여 HTTP 예외를 처리하는 방법을 배웠습니다. Laravel 개발자가 예외를 올바르게 처리하는 것은 매우 중요합니다. 이러한 기술을 사용함으로써 우리는 애플리케이션의 동작을 보다 정확하게 제어하여 애플리케이션의 신뢰성과 안정성을 향상시킬 수 있습니다. 🎜

위 내용은 laravel 요청 예외 처리의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.