首頁 > php框架 > Laravel > 主體

laravel 請求異常處理

王林
發布: 2023-05-26 16:35:07
原創
1314 人瀏覽過

Laravel 是一種流行的 PHP 框架,它提供了一個強大且靈活的系統來建立 Web 應用程式。但是,在開發過程中,難免會遇到請求異常的情況。在本文中,我們將討論 Laravel 請求異常的處理方法。

  1. 異常的分類

Laravel 中請求異常可以分為兩種類型:程式異常和 HTTP 異常。

程式異常是在程式碼運行過程中出現的異常,例如 PHP 拋出的致命錯誤,未捕獲的異常等等。

HTTP 異常是指在 HTTP 請求中出現的異常,例如 404 Not Found,500 Internal Server Error 等等。

不同類型的例外狀況需要採用不同的處理方式。

  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 格式的回應。

我們也可以在這個方法中處理其他的程式異常。這種處理方式的好處是,我們可以為每種類型的異常編寫自訂的處理器。這樣我們就能夠預測到我們會得到什麼樣的回應。

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 方法來處理 HTTP 異常。對於 Laravel 開發人員來說,正確處理異常是非常重要的。透過使用這些技術,我們能夠更精確地控制應用程式的行為,提高其可靠性和穩定性。

以上是laravel 請求異常處理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!