Hata Yönetimi

Konfigürasyon

config/exception.php

return [
    // Burada hata işleme sınıfını yapılandırın
    '' => support\exception\Handler::class,
];

Birden fazla uygulama modu kullanıyorsanız, her uygulama için ayrı ayrı hata işleme sınıfı yapılandırabilirsiniz, bkz. Çoklu Uygulama

Varsayılan Hata İşleme Sınıfı

webman'da hatalar varsayılan olarak support\exception\Handler sınıfı tarafından işlenir. Varsayılan hata işleme sınıfını değiştirmek için config/exception.php yapılandırma dosyasını değiştirebilirsiniz. Hata işleme sınıfı, Webman\Exception\ExceptionHandlerInterface arayüzünü uygulamalıdır.

interface ExceptionHandlerInterface
{
    /**
     * Log kaydet
     * @param Throwable $e
     * @return mixed
     */
    public function report(Throwable $e);

    /**
     * Yanıtı render et
     * @param Request $request
     * @param Throwable $e
     * @return Response
     */
    public function render(Request $request, Throwable $e) : Response;
}

Yanıtı Render Etme

Hata işleme sınıfındaki render metodu yanıtı render etmek için kullanılır.

Eğer config/app.php dosyasındaki debug değeri true ise (bundan böyle app.debug=true olarak anılacaktır), ayrıntılı hata bilgileri döndürülecek, aksi takdirde özet hata bilgileri döndürülecektir.

Eğer istenen yanıt json formatında ise, dönecek hata bilgileri json formatında dönecektir, örneğin:

{
    "code": "500",
    "msg": "Hata bilgisi"
}

Eğer app.debug=true ise, json verisine ek olarak bir trace alanı detaylı çağrı istifini döndürecektir.

Varsayılan hata işleme mantığını değiştirmek için kendi hata işleme sınıfınızı yazabilirsiniz.

İş Hatası BusinessException

Bazen bir iç fonksiyonda talebi sonlandırmak ve bir hata bilgisini istemciye döndürmek isteriz, bunu BusinessException fırlatarak yapabiliriz.
Örneğin:

<?php
namespace app\controller;

use support\Request;
use support\exception\BusinessException;

class FooController
{
    public function index(Request $request)
    {
        $this->chackInpout($request->post());
        return response('hello index');
    }

    protected function chackInpout($input)
    {
        if (!isset($input['token'])) {
            throw new BusinessException('Parametre hatası', 3000);
        }
    }
}

Yukarıdaki örnek bir

{"code": 3000, "msg": "Parametre hatası"}

döndürecektir.

Dikkat
İş hatası BusinessException, iş mantığını try ile yakalamaya gerek yoktur, çerçeve bunu otomatik olarak yakalar ve talep türüne göre uygun çıktı döndürür.

Özelleştirilmiş İş Hatası

Eğer yukarıdaki yanıt ihtiyaçlarınıza uygun değilse, örneğin msg öğesini message olarak değiştirmek istiyorsanız, MyBusinessException adında bir özelleştirme yapabilirsiniz.

Yeni bir app/exception/MyBusinessException.php dosyası oluşturun, içerik şu şekilde olsun:

<?php

namespace app\exception;

use support\exception\BusinessException;
use Webman\Http\Request;
use Webman\Http\Response;

class MyBusinessException extends BusinessException
{
    public function render(Request $request): ?Response
    {
        // json talepleri json verisi döner
        if ($request->expectsJson()) {
            return json(['code' => $this->getCode() ?: 500, 'message' => $this->getMessage()]);
        }
        // json olmayan talepler için bir sayfa döner
        return new Response(200, [], $this->getMessage());
    }
}

Böylece iş mantığı çağrıldığında

use app\exception\MyBusinessException;

throw new MyBusinessException('Parametre hatası', 3000);

json talebi aşağıdaki gibi bir json yanıtı alacaktır:

{"code": 3000, "message": "Parametre hatası"}

İpucu
Çünkü BusinessException hatası iş hatasıdır (örneğin, kullanıcı giriş parametre hatası), beklenebilir olduğu için çerçeve bunu ölümcül hata olarak görmez ve log kaydı tutmaz.

Özet

Herhangi bir zamanda mevcut talebi kesip istemciye bilgi döndürmek istediğinizde BusinessException hatasını kullanmayı düşünebilirsiniz.