Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk membuat pengendali pengecualian tersuai dalam CakePHP?

Bagaimana untuk membuat pengendali pengecualian tersuai dalam CakePHP?

WBOY
WBOYasal
2023-06-03 23:01:461208semak imbas

CakePHP ialah rangka kerja PHP popular yang membolehkan anda membina aplikasi web dengan cepat. Pelbagai pengecualian boleh berlaku semasa memproses input pengguna dan melaksanakan tugas seperti operasi pangkalan data. Bagaimanakah pengecualian boleh dikendalikan supaya mesej ralat tidak dibentangkan terus kepada pengguna apabila masalah berlaku? Di sinilah pengendali pengecualian tersuai masuk. Dalam artikel ini, kami akan meneroka cara membuat pengendali pengecualian tersuai dalam CakePHP.

Mengapa kita memerlukan pengendali pengecualian tersuai?

Apabila aplikasi web melemparkan pengecualian, CakePHP memaparkan halaman ralat pengecualian berkaitan aplikasi standard. Secara lalai, halaman ini termasuk surih tindanan, mesej pengecualian dan maklumat kontekstual lain yang mungkin ada. Walaupun ini sangat berguna untuk pembangun, dalam persekitaran pengeluaran, kami tidak boleh menyampaikan mesej ralat sedemikian kepada pengguna. Sebaliknya, kami mesti menyediakan halaman pengecualian tersuai untuk memastikan aplikasi anda boleh berfungsi dengan baik dan melindungi data dan maklumat privasi pengguna anda.

Mencipta pengendali pengecualian tersuai dalam CakePHP

Untuk mencipta pengendali pengecualian tersuai, kami akan menggunakan kelas pengecualian CakePHP. Ini ialah kelas asas umum yang menyediakan banyak sifat dan kaedah untuk mengurus pengecualian. Kami akan mencipta subkelas yang memanjangkan kelas CakePHPExceptionRenderer. Berikut ialah langkah-langkah untuk mencapainya:

  1. Cipta kelas pengecualian tersuai

Kami akan mencipta kelas pengecualian dipanggil AppException yang akan berfungsi sebagai kelas Asas kami untuk semua pengecualian dalam permohonan itu. Kami akan menambah beberapa sifat dan kaedah lalai di sana untuk memastikan semua pengecualian memenuhi keperluan kami. Kelas pengecualian tersuai kami sepatutnya kelihatan seperti contoh berikut:

<?php
namespace AppError;

use CakeCoreExceptionException;

class AppException extends Exception
{
    protected $_messageTemplate = 'An error occurred.';
    protected $_defaultCode = 500;

    public function __construct($message = null, $code = null, $previous = null)
    {
        if (empty($message)) {
            $message = $this->_messageTemplate;
        }

        if (empty($code)) {
            $code = $this->_defaultCode;
        }

        parent::__construct($message, $code, $previous);
    }

    public function getResponse()
    {
        // your custom response handling logic here
    }
}
  1. Cipta kelas AppExceptionRenderer

Sekarang kami akan mencipta kelas pemapar pengecualian baharu dan lanjutkan CakeErrorExceptionRendererKelas . Dalam kelas ini kita akan menentukan templat mana yang akan digunakan dalam kes pengecualian mana. Kita boleh memilih untuk menentukan pengecualian yang berbeza dalam kelas ini, seperti ralat HTTP 404, ralat pelayan dalaman, dsb. Berikut ialah contoh kelas AppExceptionRenderer:

<?php 
.namespace AppError;

use CakeErrorExceptionRenderer;
use Throwable;

class AppExceptionRenderer extends ExceptionRenderer {

    public function render() {
        $exception = $this->error instanceof Throwable ? $this->error : new FatalErrorException($this->error->getMessage(), 0, E_ERROR, __FILE__, __LINE__);
        
        $this->controller->response = $this->_getJsonResponse($exception);
        
        $this->controller->response->statusCode($exception->getCode());
        
    }
    
    protected function _getJsonResponse(Throwable $exception): JsonResponse {
        $response = new JsonResponse([
            'status' => 'error',
            'code' => $exception->getCode(),
            'message' => $exception->getMessage(),
        ],JsonResponse::HTTP_OK);
        
        if (method_exists($exception, 'getResponse')) {
            $response = $exception->getResponse();
        }
        
        return $response;
    }
}

Kelas ini akan menangkap pengecualian dan memberikan templat tersuai semasa aplikasi sedang berjalan. Anda boleh mentakrifkan logik yang diperlukan dalam kelas ini, seperti penerima pengecualian tidak konvensional, pemaparan halaman tersuai, dsb.

  1. Mengkonfigurasi pengendali pengecualian

Sekarang kita telah menentukan semua kelas yang diperlukan, kita perlu memberitahu aplikasi untuk menggunakan kelas ini apabila menangkap pengecualian. Kami akan menggunakan bahagian config/app.php fail konfigurasi CakePHP Error. Tukar tetapan berikut untuk memberitahu rangka kerja untuk menggunakan pengendali pengecualian tersuai kami:

'Error' => [
        'errorLevel' => E_ALL & ~E_USER_DEPRECATED,
        'exceptionRenderer' => 'AppErrorAppExceptionRenderer',
    ],

Ini akan memberitahu CakePHP untuk menggunakan pengendali pengecualian tersuai kami apabila pengecualian dilemparkan semasa aplikasi sedang berjalan.

Ringkasan

Mencipta pengendali pengecualian tersuai dalam CakePHP memerlukan kerja tambahan, tetapi hasilnya berbaloi. Dengan menggunakan pengendali pengecualian tersuai, kami boleh melindungi aplikasi dan data pengguna kami sambil memastikan aplikasi masih berfungsi dengan baik apabila ralat berlaku. Langkah-langkah yang dinyatakan di atas hanyalah cara asas untuk menunjukkan cara menyesuaikan pengendali pengecualian, anda boleh menukar dan memanjangkannya mengikut keperluan mengikut situasi sebenar.

Saya harap artikel ini dapat membantu anda. Jika anda mempunyai sebarang pertanyaan atau komen, sila tanya di bahagian komen di bawah. Terima kasih kerana membaca!

Atas ialah kandungan terperinci Bagaimana untuk membuat pengendali pengecualian tersuai dalam CakePHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn