Criação de extensões para o Tracy

O Tracy fornece uma ótima ferramenta para depurar sua aplicação. No entanto, às vezes você gostaria de ter algumas informações adicionais à mão. Mostraremos como escrever sua própria extensão para a Tracy Bar para tornar o desenvolvimento ainda mais agradável.

  • Criação de um painel personalizado para a Tracy Bar
  • Criação de uma extensão personalizada para o Bluescreen

Você pode encontrar um repositório de extensões prontas para o Tracy em tracy.

Extensões para a Tracy Bar

Criar uma nova extensão para a Tracy Bar não é complicado. Você cria um objeto que implementa a interface Tracy\IBarPanel, que possui dois métodos: getTab() e getPanel(). Os métodos devem retornar o código HTML da aba (uma pequena descrição exibida diretamente na Bar) e do painel. Se getPanel() não retornar nada, apenas a descrição será exibida. Se getTab() não retornar nada, nada será exibido e getPanel() não será chamado.

class ExamplePanel implements Tracy\IBarPanel
{
	public function getTab()
	{
		return /* ... */;
	}

	public function getPanel()
	{
		return /* ... */;
	}
}

Registro

O registro é feito usando Tracy\Bar::addPanel():

Tracy\Debugger::getBar()->addPanel(new ExamplePanel);

Ou você pode registrar o painel diretamente na configuração da aplicação:

tracy:
	bar:
		- ExamplePanel

Código HTML da aba

Deve se parecer aproximadamente com isto:

<span title="Descrição explicativa">
	<svg>...</svg>
	<span class="tracy-label">Título</span>
</span>

A imagem deve estar no formato SVG. Se a descrição explicativa não for necessária, o <span> pode ser omitido.

Código HTML do painel

Deve se parecer aproximadamente com isto:

<h1>Título</h1>

<div class="tracy-inner">
<div class="tracy-inner-container">
	... conteúdo ...
</div>
</div>

O título deve ser o mesmo que o título da aba ou pode conter informações adicionais.

É necessário considerar que uma extensão pode ser registrada várias vezes, por exemplo, com configurações diferentes, portanto, não se pode usar IDs CSS para estilização, mas apenas classes, no formato tracy-addons-<NomeDaClasse>[-<opcional>]. Em seguida, escreva a classe na div junto com a classe tracy-inner. Ao escrever CSS, é útil escrever #tracy-debug .classe, pois a regra terá uma prioridade maior que o reset.

Estilos padrão

No painel, <a>, <table>, <pre>, <code> são pré-estilizados. Se você quiser criar um link que oculta e exibe outro elemento, conecte-os com os atributos href e id e a classe tracy-toggle:

<a href="#tracy-addons-NomeDaClasse-{$counter}" class="tracy-toggle">Detalhes</a>

<div id="tracy-addons-NomeDaClasse-{$counter}">...</div>

Se o estado padrão deve ser recolhido, adicione a classe tracy-collapsed a ambos os elementos.

Use um contador estático para evitar a criação de IDs duplicados na mesma página.

Extensões para o Bluescreen

Desta forma, é possível adicionar visualizações personalizadas de exceções ou painéis que serão exibidos no bluescreen.

A extensão é criada com este comando:

Tracy\Debugger::getBlueScreen()->addPanel(function (?Throwable $e) { // exceção capturada
	return [
		'tab' => '...Descrição...',
		'panel' => '...Código HTML do painel...',
	];
});

A função é chamada duas vezes. Primeiro, a própria exceção é passada no parâmetro $e, e o painel retornado é renderizado no início da página. Se nada for retornado, o painel não será renderizado. Depois, é chamada com o parâmetro null, e o painel retornado é renderizado abaixo do callstack. Se a função retornar a chave 'bottom' => true no array, o painel será renderizado completamente na parte inferior.