如何创建自定义数据收集器

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 3.4,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

如何创建自定义数据收集器

ob娱乐下载Symfony分析器使用一些称为数据收集器的特殊类获取其分析和调试信息。ob娱乐下载Symfony附带了其中一些,但您也可以创建自己的。

创建自定义数据收集器

数据收集器是实现DataCollectorInterface.为方便起见,数据收集器还可以从DataCollector类,它实现接口并提供一些实用程序和$ this - >数据属性存储收集的信息。

下面的示例显示了一个存储请求信息的自定义收集器:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
/ / src / AppBundle / DataCollector / RequestCollector.php<跨度类="hljs-keyword">名称空间<跨度类="hljs-title">AppBundle\<跨度类="hljs-title">DataCollector;<跨度类="hljs-keyword">使用<跨度类="hljs-title">ob娱乐下载\<跨度类="hljs-title">组件\<跨度类="hljs-title">HttpFoundation\<跨度类="hljs-title">请求;<跨度类="hljs-keyword">使用<跨度类="hljs-title">ob娱乐下载\<跨度类="hljs-title">组件\<跨度类="hljs-title">HttpFoundation\<跨度类="hljs-title">响应;<跨度类="hljs-keyword">使用<跨度类="hljs-title">ob娱乐下载\<跨度类="hljs-title">组件\<跨度类="hljs-title">HttpKernel\<跨度类="hljs-title">DataCollector\<跨度类="hljs-title">DataCollector;<跨度类="hljs-class"><跨度类="hljs-title">RequestCollector<跨度类="hljs-keyword">扩展<跨度类="hljs-title">DataCollector{<跨度类="hljs-keyword">公共<跨度类="hljs-function">函数<跨度类="hljs-title">收集<跨度类="hljs-params">(请求<跨度类="hljs-variable">请求、响应<跨度类="hljs-variable">响应,\例外<跨度类="hljs-variable">异常= null){<跨度类="hljs-variable"><跨度类="hljs-operator">->数据= [<跨度类="hljs-string">“方法”=><跨度类="hljs-variable">请求<跨度类="hljs-operator">->getMethod(),<跨度类="hljs-string">“acceptable_content_types”=><跨度类="hljs-variable">请求<跨度类="hljs-operator">->getAcceptableContentTypes()];}<跨度类="hljs-keyword">公共<跨度类="hljs-function">函数<跨度类="hljs-title">重置<跨度类="hljs-params">(){<跨度类="hljs-variable"><跨度类="hljs-operator">->数据= [];}<跨度类="hljs-keyword">公共<跨度类="hljs-function">函数<跨度类="hljs-title">getName<跨度类="hljs-params">(){<跨度类="hljs-keyword">返回<跨度类="hljs-string">“app.request_collector”;}<跨度类="hljs-comment">/ /……
收集()方法:

将收集的数据存储在本地属性中($ this - >数据如果你从DataCollector).如果无法通过请求或响应获得要收集的数据,则在数据收集器中注入所需的服务。

谨慎

收集()方法只被调用一次。它不是用来“收集”数据,而是用来“拾取”服务存储的数据。

谨慎

由于分析器序列化数据收集器实例,您不应该存储不能序列化的对象(如PDO对象),或者您需要提供自己的对象serialize ()方法。

重置()方法:
在请求之间调用它来重置分析器的状态。删除所有收集到的信息收集()方法。
getName ()方法:
返回收集器标识符,该标识符在应用程序中必须唯一。稍后将使用此值访问收集器信息(请参阅如何在功能测试中使用分析器),所以建议返回一个短,小写,没有空格的字符串。

收集()方法在kernel.response事件。如果您需要收集以后才可用的数据,请执行LateDataCollectorInterface并定义lateCollect ()方法,该方法在分析器数据序列化之前调用kernel.terminate事件)。

启用自定义数据收集器

如果你在用默认的服务。yml配置可以使用autoconfigure,那么Symfob娱乐下载ony将自动看到您的新数据收集器!你的收集()方法应该在下次刷新时调用。

如果你不吸毒的话可以使用autoconfigure,你也可以手动连接您的服务而且标签它与data_collector

添加Web分析器模板

数据收集器收集的信息可以显示在web调试工具栏和web分析器中。为此,您需要创建一个包含一些特定块的Twig模板。

但是,首先你必须在数据收集器类中添加一些getter,使模板能够访问收集的信息:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/ / src / AppBundle / DataCollector / RequestCollector.php<跨度类="hljs-keyword">名称空间<跨度类="hljs-title">AppBundle\<跨度类="hljs-title">DataCollector;<跨度类="hljs-keyword">使用<跨度类="hljs-title">ob娱乐下载\<跨度类="hljs-title">组件\<跨度类="hljs-title">HttpKernel\<跨度类="hljs-title">DataCollector\<跨度类="hljs-title">DataCollector;<跨度类="hljs-class"><跨度类="hljs-title">RequestCollector<跨度类="hljs-keyword">扩展<跨度类="hljs-title">DataCollector{<跨度类="hljs-comment">/ /……<跨度类="hljs-keyword">公共<跨度类="hljs-function">函数<跨度类="hljs-title">getMethod<跨度类="hljs-params">(){<跨度类="hljs-keyword">返回<跨度类="hljs-variable"><跨度类="hljs-operator">->数据(<跨度类="hljs-string">“方法”];}<跨度类="hljs-keyword">公共<跨度类="hljs-function">函数<跨度类="hljs-title">getAcceptableContentTypes<跨度类="hljs-params">(){<跨度类="hljs-keyword">返回<跨度类="hljs-variable"><跨度类="hljs-operator">->数据(<跨度类="hljs-string">“acceptable_content_types”];}}

在最简单的情况下,您只想在工具栏中显示信息,而不提供分析器面板。这需要定义工具栏块和设置值的两个变量称为图标而且文本

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
{%<跨度类="hljs-name">扩展“@WebProfiler /分析器/ layout.html。嫩枝' %}<跨度类="xml">{%<跨度类="hljs-name">工具栏%}<跨度类="xml">{%<跨度类="hljs-name">图标%}<跨度类="xml">{#这是显示在工具栏面板中的内容#}<跨度类="xml"><<跨度类="hljs-name">跨度<跨度类="hljs-attr">类=<跨度类="hljs-string">“图标”><跨度类="hljs-tag"><<跨度类="hljs-name">img<跨度类="hljs-attr">src=<跨度类="hljs-string">“…”<跨度类="hljs-attr">alt=<跨度类="hljs-string">""/><跨度类="hljs-tag">跨度><跨度类="hljs-tag"><<跨度类="hljs-name">跨度<跨度类="hljs-attr">类=<跨度类="hljs-string">“sf-toolbar-status”>请求<跨度类="hljs-tag">跨度><跨度类="hljs-template-tag">{%<跨度类="hljs-name">endset%}<跨度类="xml">{%<跨度类="hljs-name">文本%}<跨度类="xml">{#这是鼠标悬停在工具栏面板上显示的内容#}<跨度类="xml"><<跨度类="hljs-name">div<跨度类="hljs-attr">类=<跨度类="hljs-string">“sf-toolbar-info-piece”><跨度类="hljs-tag"><<跨度类="hljs-name">b>方法<跨度类="hljs-tag">b><跨度类="hljs-tag"><<跨度类="hljs-name">跨度><跨度类="hljs-template-variable">{{收集器。方法}}<跨度类="xml">跨度><跨度类="hljs-tag">div><跨度类="hljs-tag"><<跨度类="hljs-name">div<跨度类="hljs-attr">类=<跨度类="hljs-string">“sf-toolbar-info-piece”><跨度类="hljs-tag"><<跨度类="hljs-name">b>接受的内容类型<跨度类="hljs-tag">b><跨度类="hljs-tag"><<跨度类="hljs-name">跨度><跨度类="hljs-template-variable">{{collector.acceptableContentTypes |<跨度类="hljs-keyword">加入(', ')}}<跨度类="xml">跨度><跨度类="hljs-tag">div><跨度类="hljs-template-tag">{%<跨度类="hljs-name">endset%}<跨度类="xml">{# link'值设置为'false'意味着该面板不显示web分析器中的部分#}<跨度类="xml">{{<跨度类="hljs-name">包括<跨度类="hljs-params">(“@WebProfiler /分析器/ toolbar_item.html。Twig ', {link: false})}}<跨度类="xml">{%<跨度类="hljs-name">endblock%}

提示

内置收集器模板将其所有映像定义为嵌入的base64编码的映像。这使得他们的工作无处不在,而不必与web资产链接混乱:

1
<<跨度类="hljs-name">img<跨度类="hljs-attr">src=<跨度类="hljs-string">“数据:图像/ png, base64……”/>

另一个解决方案是将图像定义为SVG文件。除了分辨率无关之外,这些图像可以嵌入到Twig模板中,或者从外部文件中包含,以便在多个模板中重用它们:

1
{{<跨度类="hljs-name">包括<跨度类="hljs-params">(“data_collector / icon.svg”)}}

建议您对自己的工具栏面板使用后一种技术。

如果工具栏面板包含扩展的web分析器信息,Twig模板还必须定义额外的块:

12 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
{%<跨度类="hljs-name">扩展“@WebProfiler /分析器/ layout.html。嫩枝' %}<跨度类="xml">{%<跨度类="hljs-name">工具栏%}<跨度类="xml">{%<跨度类="hljs-name">图标%}<跨度类="xml"><<跨度类="hljs-name">跨度<跨度类="hljs-attr">类=<跨度类="hljs-string">“图标”><跨度类="hljs-tag"><<跨度类="hljs-name">img<跨度类="hljs-attr">src=<跨度类="hljs-string">“…”<跨度类="hljs-attr">alt=<跨度类="hljs-string">""/><跨度类="hljs-tag">跨度><跨度类="hljs-tag"><<跨度类="hljs-name">跨度<跨度类="hljs-attr">类=<跨度类="hljs-string">“sf-toolbar-status”>请求<跨度类="hljs-tag">跨度><跨度类="hljs-template-tag">{%<跨度类="hljs-name">endset%}<跨度类="xml">{%<跨度类="hljs-name">文本%}<跨度类="xml"><<跨度类="hljs-name">div<跨度类="hljs-attr">类=<跨度类="hljs-string">“sf-toolbar-info-piece”><跨度类="hljs-comment">{#……#}<跨度类="xml">div><跨度类="hljs-template-tag">{%<跨度类="hljs-name">endset%}<跨度类="xml">{{<跨度类="hljs-name">包括<跨度类="hljs-params">(“@WebProfiler /分析器/ toolbar_item.html。Twig ', {'link': true})}}<跨度类="xml">{%<跨度类="hljs-name">endblock%}<跨度类="xml">{%<跨度类="hljs-name">头%}<跨度类="xml">{#可选的。在这里你可以链接到或定义你自己的CSS和JS内容。#}<跨度类="xml">使用{{parent()}}扩展默认样式,而不是覆盖它们。#}<跨度类="xml">{%<跨度类="hljs-name">endblock%}<跨度类="xml">{%<跨度类="hljs-name">菜单%}<跨度类="xml">{#使用全屏分析器时出现左侧菜单。#}<跨度类="xml"><<跨度类="hljs-name">跨度<跨度类="hljs-attr">类=<跨度类="hljs-string">“标签”><跨度类="hljs-tag"><<跨度类="hljs-name">跨度<跨度类="hljs-attr">类=<跨度类="hljs-string">“图标”><跨度类="hljs-tag"><<跨度类="hljs-name">img<跨度类="hljs-attr">src=<跨度类="hljs-string">“…”<跨度类="hljs-attr">alt=<跨度类="hljs-string">""/><跨度类="hljs-tag">跨度><跨度类="hljs-tag"><<跨度类="hljs-name">强大的>请求<跨度类="hljs-tag">强大的><跨度类="hljs-tag">跨度><跨度类="hljs-template-tag">{%<跨度类="hljs-name">endblock%}<跨度类="xml">{%<跨度类="hljs-name">面板%}<跨度类="xml">{#可选,用于显示最多的细节。#}<跨度类="xml"><<跨度类="hljs-name">h2>可接受的内容类型<跨度类="hljs-tag">h2><跨度类="hljs-tag"><<跨度类="hljs-name">表格><跨度类="hljs-tag"><<跨度类="hljs-name">tr><跨度类="hljs-tag"><<跨度类="hljs-name">th>内容类型<跨度类="hljs-tag">th><跨度类="hljs-tag">tr><跨度类="hljs-template-tag">{%<跨度类="hljs-name">输入收集器。acceptableContentTypes %}<跨度类="xml"><<跨度类="hljs-name">tr><跨度类="hljs-tag"><<跨度类="hljs-name">道明><跨度类="hljs-template-variable">{{type}}<跨度类="xml">道明><跨度类="hljs-tag">tr><跨度类="hljs-template-tag">{%<跨度类="hljs-name">endfor%}<跨度类="xml">表格><跨度类="hljs-template-tag">{%<跨度类="hljs-name">endblock%}

菜单而且面板块是定义与此数据收集器关联的web分析器面板中显示的内容所需的唯一块。所有块都可以访问收集器对象。

最后,为了启用数据收集器模板,重写您的服务配置以指定包含模板的标记:

  • YAML
  • XML
  • PHP
12 3 4 5 6 7 8 9 10 11 12
# app / config / services.yml<跨度类="hljs-attr">服务:<跨度类="hljs-string">AppBundle \ DataCollector \ RequestCollector:<跨度类="hljs-attr">标签:<跨度类="hljs-bullet">-<跨度类="hljs-attr">名称:<跨度类="hljs-string">data_collector<跨度类="hljs-attr">模板:<跨度类="hljs-string">“data_collector / template.html.twig”<跨度类="hljs-comment">#必须匹配getName()方法返回的值<跨度类="hljs-attr">id:<跨度类="hljs-string">“app.request_collector”<跨度类="hljs-comment">#可选优先级<跨度类="hljs-comment">#优先级:300<跨度类="hljs-attr">公众:<跨度类="hljs-literal">假

工具栏中每个面板的位置由每个收集器定义的优先级决定。优先级定义为正整数或负整数,默认为0.大多数内置收集器使用255作为他们的首要任务。如果您希望您的收集器显示在它们之前,请使用更高的值(如300)。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。