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.