Benim PHP projelerde, ben birkaç farklı tacts denedim. Benim için iyi iş gibi görünüyor aşağıdaki çözüm için geldim:
Birincisi, ben yazmak herhangi bir büyük PHP uygulama uygulama düzeyinde veri ve davranışlarını yöneten merkez tekiz çeşit var. "Uygulama" nesne. Ben her modülünden oluşturulan geribildirim toplamak için bu nesneyi kullanın çünkü burada söz. Render modülü kullanıcıya gösterilmesi gereken gördüğü geribildirim için uygulama nesnesi sorgulayabilirsiniz.
Bir alt düzeyde, her sınıf hata yönetimi yöntemleri içeren bazı temel sınıfından türetilmiştir. Örneğin, bir "AddError (kod, string, küresel)" ve "GetErrors ()" ve "ClearErrors". "AddError" yöntemi iki şey yapar: o nesne için bir örnek özgü dizide bu hata yerel bir kopyasını saklar ve (isteğe bağlı) ("küresel" boolean) bu daha sonra mağazaları hata bu hata uygulama nesnesi bildirir render gelecekteki kullanımı.
Yani şimdi burada pratikte nasıl çalışıyor:
Belki AddError ClearErrors GetErrorCodes GetErrorsAsStrings GetErrorCount ve {[(: 'Object', aşağıdaki yöntemleri tanımlar unutmayın 5)]} kolaylık sağlamak için
// $GLOBALS['app'] = new Application();
class MyObject extends Object
{
/**
* @return bool Returns false if failed
*/
public function DoThing()
{
$this->ClearErrors();
if ([something succeeded])
{
return true;
}
else
{
$this->AddError(ERR_OP_FAILED,"Thing could not be done");
return false;
}
}
}
$ob = new MyObject();
if ($ob->DoThing())
{
echo 'Success.';
}
else
{
// Right now, i may not really care *why* it didn't work (the user
// may want to know about the problem, though (see below).
$ob->TrySomethingElse();
}
// ...LATER ON IN THE RENDERING MODULE
echo implode('<br/>',$GLOBALS['app']->GetErrorsAsStrings());
Bu hoşuma nedeni çünkü:
- Ben şahsen kodu daha kıvrık hale inanıyorum çünkü ben olması gerektiğini istisnalar nefret ediyorum
- Bazen sadece bir işlev neyin yanlış gittiğini tam olarak başarılı ya da başarısız ve bilmek gerekir
- Bir çok kez belirli bir hata kodu gerekmez, ancak belirli bir hata dize gerekir ve her olası hata durumu için bir hata kodu oluşturmak istemiyorum. Bazen gerçekten sadece bir "opfailed" kodunu kullanın ama dize kendisi kullanıcının uğruna bazı detaylara girmek istiyorum. Bu, esneklik sağlar
- Bana halletmek için ihtiyacı olan şeyi, her fonksiyonel alanını vermek için iki hata toplama yerleri (onlar hakkında kullanıcıyı söylüyorum modülleri render tarafından kullanılmak üzere arama algoritması ve küresel düzeyde kullanımı için yerel düzeyde) olması gerçekten çalıştı.