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

编辑本页

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

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

创建自定义数据收集器

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

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

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src / DataCollector / RequestCollector.php<跨度类="hljs-keyword">名称空间<跨度类="hljs-title">应用程序\<跨度类="hljs-title">DataCollector;<跨度类="hljs-keyword">使用<跨度类="hljs-title">ob娱乐下载\<跨度类="hljs-title">包\<跨度类="hljs-title">FrameworkBundle\<跨度类="hljs-title">DataCollector\<跨度类="hljs-title">AbstractDataCollector;<跨度类="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-class"><跨度类="hljs-title">RequestCollector<跨度类="hljs-keyword">扩展<跨度类="hljs-title">AbstractDataCollector{<跨度类="hljs-keyword">公共<跨度类="hljs-function">函数<跨度类="hljs-title">收集<跨度类="hljs-params">(请求<跨度类="hljs-variable">请求、响应<跨度类="hljs-variable">响应,\Throwable<跨度类="hljs-variable">异常= null){<跨度类="hljs-variable"><跨度类="hljs-operator">->数据= [<跨度类="hljs-string">“方法”=><跨度类="hljs-variable">请求<跨度类="hljs-operator">->getMethod(),<跨度类="hljs-string">“acceptable_content_types”=><跨度类="hljs-variable">请求<跨度类="hljs-operator">->getAcceptableContentTypes()];}}

这些是你可以在数据收集器类中定义的方法:

收集()方法:

将收集的数据存储在本地属性中($ this - >数据如果你从AbstractDataCollector).如果您需要一些服务来收集数据,请将这些服务注入到数据收集器构造函数中。

谨慎

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

谨慎

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

重置()方法:
在请求之间调用它来重置分析器的状态。默认情况下,它只清空$ this - >数据内容,但您可以重写此方法以执行额外的清理。
getName ()方法:
返回收集器标识符,该标识符在应用程序中必须唯一。默认情况下,它返回数据收集器类的FQCN,但您可以重写此方法以返回自定义名称(例如。app.request_collector).稍后将使用此值访问收集器信息(请参阅如何在功能测试中使用分析器)所以你可能更喜欢使用短字符串而不是FQCN字符串。

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

请注意

如果你在用默认的服务。yaml的配置可以使用autoconfigure,那么Symfob娱乐下载ony将在下一个页面刷新后开始使用您的数据收集器。否则,手动启用数据采集器

添加Web分析器模板

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

首先,添加getTemplate ()方法返回要使用的Twig模板的路径。然后,添加一些getter给模板访问收集的信息:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/ / src / DataCollector / RequestCollector.php<跨度类="hljs-keyword">名称空间<跨度类="hljs-title">应用程序\<跨度类="hljs-title">DataCollector;<跨度类="hljs-keyword">使用<跨度类="hljs-title">ob娱乐下载\<跨度类="hljs-title">包\<跨度类="hljs-title">FrameworkBundle\<跨度类="hljs-title">DataCollector\<跨度类="hljs-title">AbstractDataCollector;<跨度类="hljs-class"><跨度类="hljs-title">RequestCollector<跨度类="hljs-keyword">扩展<跨度类="hljs-title">AbstractDataCollector{<跨度类="hljs-comment">/ /……<跨度类="hljs-keyword">公共<跨度类="hljs-keyword">静态<跨度类="hljs-function">函数<跨度类="hljs-title">getTemplate<跨度类="hljs-params">():?<跨度类="hljs-title">字符串{<跨度类="hljs-keyword">返回<跨度类="hljs-string">“data_collector / template.html.twig”;}<跨度类="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 28
{/ data_collector / template.html #模板。树枝#}<跨度类="xml">{%<跨度类="hljs-name">扩展“@WebProfiler /分析器/ layout.html。嫩枝' %}<跨度类="xml">{%<跨度类="hljs-name">工具栏%}<跨度类="xml">{%<跨度类="hljs-name">图标%}<跨度类="xml">{#这是显示在工具栏面板中的内容#}<跨度类="xml"><<跨度类="hljs-name">svg<跨度类="hljs-attr">xmlns=<跨度类="hljs-string">“http://www.w3.org/2000/svg”>...<跨度类="hljs-tag">svg><跨度类="hljs-tag"><<跨度类="hljs-name">跨度<跨度类="hljs-attr">类=<跨度类="hljs-string">“sf-toolbar-value”>请求<跨度类="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%}

提示

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

1 2 3 4
{%<跨度类="hljs-name">图标%}<跨度类="xml">{{<跨度类="hljs-name">包括<跨度类="hljs-params">(“data_collector / icon.svg”)}}<跨度类="xml">{#……#}<跨度类="xml">{%<跨度类="hljs-name">endset%}

如果工具栏面板包含扩展的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
{/ data_collector / template.html #模板。树枝#}<跨度类="xml">{%<跨度类="hljs-name">扩展“@WebProfiler /分析器/ layout.html。嫩枝' %}<跨度类="xml">{%<跨度类="hljs-name">工具栏%}<跨度类="xml">{%<跨度类="hljs-name">图标%}<跨度类="xml">{#……#}<跨度类="xml">{%<跨度类="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的配置可以使用autoconfigure,那么Symfob娱乐下载ony将开始在工具栏中显示您的收集器数据。否则,手动启用数据采集器

启用自定义数据收集器

如果您不使用Symfony的默认配ob娱乐下载置自动装配和自动配置你需要显式配置数据收集器:

  • YAML
  • XML
  • PHP
12 3 4 5 6 7 8 9 10 11 12
#配置/ services.yaml<跨度类="hljs-attr">服务:<跨度类="hljs-string">App \ DataCollector \ RequestCollector:<跨度类="hljs-attr">标签:<跨度类="hljs-bullet">-<跨度类="hljs-attr">名称:<跨度类="hljs-string">data_collector<跨度类="hljs-comment">#必须匹配getName()方法返回的值<跨度类="hljs-attr">id:<跨度类="hljs-string">“App \ DataCollector \ RequestCollector”<跨度类="hljs-comment"># optional template(它比getTemplate()返回的值更优先)<跨度类="hljs-attr">模板:<跨度类="hljs-string">“data_collector / template.html.twig”<跨度类="hljs-comment">#可选优先级(正整数或负整数;默认值= 0)<跨度类="hljs-comment">#优先级:300
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。
ob娱乐下载Symfony 6.2支持通过苏禄人
sulu-logo副本 使用Sketch创建。
ob娱乐下载Symfony 6.2支持通过Les-Tilleuls.coop