Documentação do Symfony - versão 3.1
Renderizada do repositório symfony-docs-pt-BR no Github
O Profiler do Symfony2 delega a coleta de dados para os coletores de dados. O Symfony2 vem com alguns deles, mas você pode criar o seu próprio facilmente.
Criar um coletor de dados personalizado é tão simples quanto implementar o
DataCollectorInterface
:
interface DataCollectorInterface
{
/**
* Collects data for the given Request and Response.
*
* @param Request $request A Request instance
* @param Response $response A Response instance
* @param \Exception $exception An Exception instance
*/
function collect(Request $request, Response $response, \Exception $exception = null);
/**
* Returns the name of the collector.
*
* @return string The collector name
*/
function getName();
}
O método getName()
deve retornar um nome único. Ele é usado para acessar a
informação mais tarde (veja o /cookbook/testing/profiling por
exemplo).
O método collect()
é responsável por armazenar os dados que ele quer fornecer
acesso nas propriedades locais.
Caution
Como o profiler serializa instâncias do coletor de dados, você não deve
armazenar objetos que não podem ser serializados (como objetos PDO), ou você precisa
fornecer o seu próprio método serialize()
.
Na maioria das vezes, é conveniente estender o
DataCollector
e
popular a propriedade $this->data
(que cuida da serialização da
propriedade $this->data
):
class MemoryDataCollector extends DataCollector
{
public function collect(Request $request, Response $response, \Exception $exception = null)
{
$this->data = array(
'memory' => memory_get_peak_usage(true),
);
}
public function getMemory()
{
return $this->data['memory'];
}
public function getName()
{
return 'memory';
}
}
Para ativar um coletor de dados, adicione-o como um serviço regular, em uma de suas
configurações, e adicione a tag data_collector
a ele:
1 2 3 4 5 | services:
data_collector.your_collector_name:
class: Fully\Qualified\Collector\Class\Name
tags:
- { name: data_collector }
|
1 2 3 | <service id="data_collector.your_collector_name" class="Fully\Qualified\Collector\Class\Name">
<tag name="data_collector" />
</service>
|
1 2 3 4 | $container
->register('data_collector.your_collector_name', 'Fully\Qualified\Collector\Class\Name')
->addTag('data_collector')
;
|
Quando você quiser exibir os dados coletados pelo seu Coletor de Dados na barra de ferramentas para debug web ou no profiler web, adicione um template Twig seguindo este esqueleto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | {% extends 'WebProfilerBundle:Profiler:layout.html.twig' %}
{% block toolbar %}
{# the web debug toolbar content #}
{% endblock %}
{% block head %}
{# if the web profiler panel needs some specific JS or CSS files #}
{% endblock %}
{% block menu %}
{# the menu content #}
{% endblock %}
{% block panel %}
{# the panel content #}
{% endblock %}
|
Cada bloco é opcional. O bloco toolbar
é usado para a barra de ferramentas para debug web
e o menu
e panel
são usados para adicionar um painel no
profiler web.
Todos os blocos têm acesso ao objeto collector
.
Tip
Templates integrados usam uma imagem codificada em base64 para a barra de ferramentas (<img
src="data:image/png;base64,..."
). Você pode facilmente calcular o
valor base64 para uma imagem com este pequeno script: echo
base64_encode(file_get_contents($_SERVER['argv'][1]));
.
Para ativar o template, adicione um atributo template
para a tag data_collector
em sua configuração. Por exemplo, assumindo que o seu template está em algum
AcmeDebugBundle
:
1 2 3 4 5 | services:
data_collector.your_collector_name:
class: Acme\DebugBundle\Collector\Class\Name
tags:
- { name: data_collector, template: "AcmeDebugBundle:Collector:templatename", id: "your_collector_name" }
|
1 2 3 | <service id="data_collector.your_collector_name" class="Acme\DebugBundle\Collector\Class\Name">
<tag name="data_collector" template="AcmeDebugBundle:Collector:templatename" id="your_collector_name" />
</service>
|
1 2 3 4 5 6 7 | $container
->register('data_collector.your_collector_name', 'Acme\DebugBundle\Collector\Class\Name')
->addTag('data_collector', array(
'template' => 'AcmeDebugBundle:Collector:templatename',
'id' => 'your_collector_name',
))
;
|