如何创建自定义数据收集器
编辑本页警告:您正在浏览的文档欧宝官网下载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将自动看到您的新数据收集器!你的收集()
方法应该在下次刷新时调用。
添加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-name">跨度跨度>>跨度><跨度类="hljs-tag"><<跨度类="hljs-name">跨度跨度><跨度类="hljs-attr">类跨度>=<跨度类="hljs-string">“sf-toolbar-status”跨度>>跨度>请求<跨度类="hljs-tag"><跨度类="hljs-name">跨度跨度>>跨度>跨度><跨度类="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"><跨度类="hljs-name">b跨度>>跨度><跨度类="hljs-tag"><<跨度类="hljs-name">跨度跨度>>跨度>跨度><跨度类="hljs-template-variable">{{收集器。方法}}跨度><跨度类="xml"><跨度类="hljs-name">跨度跨度>>跨度><跨度类="hljs-tag"><跨度类="hljs-name">div跨度>>跨度><跨度类="hljs-tag"><<跨度类="hljs-name">div跨度><跨度类="hljs-attr">类跨度>=<跨度类="hljs-string">“sf-toolbar-info-piece”跨度>>跨度><跨度类="hljs-tag"><<跨度类="hljs-name">b跨度>>跨度>接受的内容类型<跨度类="hljs-tag"><跨度类="hljs-name">b跨度>>跨度><跨度类="hljs-tag"><<跨度类="hljs-name">跨度跨度>>跨度>跨度><跨度类="hljs-template-variable">{{collector.acceptableContentTypes |<跨度类="hljs-keyword">加入跨度>(', ')}}跨度><跨度类="xml"><跨度类="hljs-name">跨度跨度>>跨度><跨度类="hljs-tag"><跨度类="hljs-name">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-name">跨度跨度>>跨度><跨度类="hljs-tag"><<跨度类="hljs-name">跨度跨度><跨度类="hljs-attr">类跨度>=<跨度类="hljs-string">“sf-toolbar-status”跨度>>跨度>请求<跨度类="hljs-tag"><跨度类="hljs-name">跨度跨度>>跨度>跨度><跨度类="hljs-template-tag">{%<跨度类="hljs-name">endset跨度>跨度>%}跨度><跨度类="xml">{%<跨度类="hljs-name">集跨度>跨度>文本%}跨度><跨度类="xml"><<跨度类="hljs-name">div跨度><跨度类="hljs-attr">类跨度>=<跨度类="hljs-string">“sf-toolbar-info-piece”跨度>>跨度>跨度><跨度类="hljs-comment">{#……#}跨度><跨度类="xml"><跨度类="hljs-name">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-name">跨度跨度>>跨度><跨度类="hljs-tag"><<跨度类="hljs-name">强大的跨度>>跨度>请求<跨度类="hljs-tag"><跨度类="hljs-name">强大的跨度>>跨度><跨度类="hljs-tag"><跨度类="hljs-name">跨度跨度>>跨度>跨度><跨度类="hljs-template-tag">{%<跨度类="hljs-name">endblock跨度>跨度>%}跨度><跨度类="xml">{%<跨度类="hljs-name">块跨度>跨度>面板%}跨度><跨度类="xml">{#可选,用于显示最多的细节。#}跨度><跨度类="xml"><<跨度类="hljs-name">h2跨度>>跨度>可接受的内容类型<跨度类="hljs-tag"><跨度类="hljs-name">h2跨度>>跨度><跨度类="hljs-tag"><<跨度类="hljs-name">表格跨度>>跨度><跨度类="hljs-tag"><<跨度类="hljs-name">tr跨度>>跨度><跨度类="hljs-tag"><<跨度类="hljs-name">th跨度>>跨度>内容类型<跨度类="hljs-tag"><跨度类="hljs-name">th跨度>>跨度><跨度类="hljs-tag"><跨度类="hljs-name">tr跨度>>跨度>跨度><跨度类="hljs-template-tag">{%<跨度类="hljs-name">为跨度>跨度>输入收集器。acceptableContentTypes %}跨度><跨度类="xml"><<跨度类="hljs-name">tr跨度>>跨度><跨度类="hljs-tag"><<跨度类="hljs-name">道明跨度>>跨度>跨度><跨度类="hljs-template-variable">{{type}}跨度><跨度类="xml"><跨度类="hljs-name">道明跨度>>跨度><跨度类="hljs-tag"><跨度类="hljs-name">tr跨度>>跨度>跨度><跨度类="hljs-template-tag">{%<跨度类="hljs-name">endfor跨度>跨度>%}跨度><跨度类="xml"><跨度类="hljs-name">表格跨度>>跨度>跨度><跨度类="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)。