Tracy Extension'ları Yazma
Tracy, uygulamanızda hata ayıklamak için harika bir araçtır. Ancak bazen elinizin altında ek bilgi olmasını isteyebilirsiniz. Geliştirmeyi daha da keyifli kılmak için Tracy Bar'a kendi extension'larınızı nasıl yazacağınızı göstereceğiz.
- Kendi Tracy Bar panelinizi oluşturma
- Kendi Bluescreen extension'ınızı oluşturma
Tracy için hazır extension'ların bulunduğu bir depoyu Componette adresinde bulabilirsiniz.
Tracy Bar Extension'ları
Tracy Bar için yeni bir extension yazmak dolaysızdır. Tracy\IBarPanel arayüzünü uygulayan bir nesne
oluşturun; bu arayüzde iki metot vardır: getTab() ve getPanel(). Bu metotlar, sekmenin (doğrudan Bar
üzerinde görünen küçük etiket) ve panelin (sekmeye tıklandığında açılan kutu) HTML kodunu döndürmelidir.
getPanel() hiçbir şey döndürmezse yalnızca sekme görüntülenir. getTab() hiçbir şey
döndürmezse hiçbir şey görüntülenmez ve getPanel() çağrılmaz.
class ExamplePanel implements Tracy\IBarPanel
{
public function getTab()
{
return /* ... */;
}
public function getPanel()
{
return /* ... */;
}
}
Kayıt
Kayıt, Tracy\Debugger::getBar()->addPanel() çağrılarak yapılır:
Tracy\Debugger::getBar()->addPanel(new ExamplePanel);
Alternatif olarak paneli doğrudan uygulama yapılandırmasında kaydedebilirsiniz:
tracy:
bar:
- ExamplePanel
Sekmenin HTML Kodu
Şuna benzer görünmelidir:
<span title="Açıklayıcı ipucu">
<svg>...</svg>
<span class="tracy-label">Başlık</span>
</span>
Görsel SVG biçiminde olmalıdır. Açıklayıcı ipucu gerekmiyorsa dıştaki <span> atlanabilir.
Panelin HTML Kodu
Şuna benzer görünmelidir:
<h1>Başlık</h1>
<div class="tracy-inner">
<div class="tracy-inner-container">
... içerik ...
</div>
</div>
Başlık ya sekmenin başlığıyla aynı olmalı ya da ek bilgi içermelidir.
Bir extension'ın belki farklı ayarlarla, birden çok kez kaydedilebileceğini unutmayın. Bu yüzden biçimlendirme için CSS
ID'leri kullanamazsınız, yalnızca sınıflar kullanabilirsiniz; tercihen
tracy-addons-<ClassName>[-<optional>] biçiminde. Bu sınıfı, tracy-inner sınıfıyla
birlikte div'e ekleyin. CSS yazarken seçicilerin önüne #tracy-debug .your-class koymak yararlıdır; çünkü bu,
kurala sıfırlama stillerinden daha yüksek özgüllük verir.
Varsayılan Stiller
Panelde <a>, <table>, <pre> ve <code>
elemanlarının önceden tanımlı stilleri vardır. Başka bir elemanı gizleyip gösteren bir bağlantı oluşturmak isterseniz,
onları href ve id nitelikleriyle ve tracy-toggle sınıfıyla bağlayın:
<a href="#tracy-addons-ClassName-{$counter}" class="tracy-toggle">Ayrıntılar</a>
<div id="tracy-addons-ClassName-{$counter}">...</div>
Varsayılan durum katlanmışsa, her iki elemana da tracy-collapsed sınıfını ekleyin.
Bir sayfada yinelenen ID'leri önlemek için statik bir sayaç kullanın.
Özel Varlıklar
Panelinizin kendi stil sayfası ya da betiği gerekiyorsa, Tracy'nin kendi varlıklarının yanında ek dosyalar yüklemesini sağlayabilirsiniz:
Tracy\Debugger::$customCssFiles[] = __DIR__ . '/panel.css';
Tracy\Debugger::$customJsFiles[] = __DIR__ . '/panel.js';
Yapay Zekâ Ajanı Desteği
Bir yapay zekâ ajanı tarayıcıyı sürdüğünde Tracy, Tracy Bar'ın markdown özetini JS konsoluna gönderir. Özel
paneller, IBarPanel gerçekleştirimlerine bir getAgentInfo(): ?string metodu ekleyerek kendi markdown
çıktılarını sağlayabilir:
class DatabasePanel implements Tracy\IBarPanel
{
public function getTab(): string { /* ... */ }
public function getPanel(): string { /* ... */ }
public function getAgentInfo(): ?string
{
return "## Database\n\n- Queries: {$this->count}\n- Total time: {$this->time} ms\n";
}
}
Döndürülen markdown, çubuğun markdown özetine katılır. Metot yoksa ya da null döndürürse panel özetten
çıkarılır.
Tam resim için bkz. Tracy'nin yapay zekâ ajanı tümleştirmesi.
Bluescreen Extension'ları
Bu şekilde, bluescreen'de görünecek özel istisna görselleştirmeleri ya da paneller ekleyebilirsiniz.
Bir extension şöyle oluşturulur:
Tracy\Debugger::getBlueScreen()->addPanel(function (?Throwable $e) { // yakalanan istisna
return [
'tab' => '...Başlık...',
'panel' => '...panelin HTML içeriği...',
];
});
Fonksiyon iki kez çağrılır. Önce $e parametresinde istisnanın kendisi aktarılır (bir istisna oluştuysa)
ve döndürülen panel sayfanın başında render edilir. null ya da boş bir dizi döndürürse panel render
edilmez. Sonra $e = null ile çağrılır ve döndürülen panel çağrı yığınının altında render edilir.
Fonksiyon dizide 'bottom' => true döndürürse panel en altta render edilir.
Panellerin yanı sıra addAction() ile eylemler de ekleyebilirsiniz; bunlar hata sayfasının
başlığında yerleşik olanların (örneğin search) yanında görünen tıklanabilir bağlantılar ya da
düğmelerdir:
Tracy\Debugger::getBlueScreen()->addAction(function (Throwable $e): ?array {
if ($e instanceof MyException) {
return [
'link' => 'https://example.com/help?code=' . $e->getCode(),
'label' => 'yardımı gör',
];
}
return null;
});
Callback, yakalanan istisnayı alır ve link ile label anahtarlarını içeren bir dizi ya da ilgili
istisna için eylem eklemek istemiyorsa null döndürür.
Dosya Oluşturma Eylemi
Hata sayfasında henüz var olmayan bir dosyaya tıkladığınızda Tracy onu oluşturmayı önerir (create file eylemi). Böyle bir dosyanın başlangıç içeriğini bir üretici kaydederek denetleyebilirsiniz:
Tracy\Debugger::getBlueScreen()->addFileGenerator(function (string $file, ?string $class): ?string {
if (str_ends_with($file, 'Test.php')) {
return "<?php\n\nclass $class extends Tester\\TestCase\n{\n\t\$END\$\n}\n";
}
return null;
});
Callback, hedef dosya yolunu ve biliniyorsa içinde tanımlanması gereken sınıfın adını alır. Başlangıç içeriğini
($END$ belirteci imlecin konacağı yeri işaretler ve çıktıdan kaldırılır) ya da kararı başka bir üreticiye
bırakmak için null döndürür. Üreticiler en son kaydedilenden başlayarak denenir; yerleşik üretici düz bir
PHP iskeleti üretir.
Fiber'lar ve Generator'lar
Bir fiber ya da generator askıya alınmışken bir istisna fırlatılırsa, onun yığını sıradan çağrı yığınının parçası olmaz. Tracy, istisnadan ulaşılabilen fiber'ların ve generator'ların yığınını otomatik olarak gösterir, ama bağımsız çalışan biri gözden kaçardı. Onu BlueScreen'e elle ekleyebilirsiniz:
Tracy\Debugger::getBlueScreen()->addFiber($fiber);