3

我想用我自己的自定义数据扩展 Symfony2 调试工具栏。

我有一项服务,我想记录特定的方法调用,然后将它们显示在 Web 调试工具栏中。

我阅读了食谱文章,但它不是很有帮助。

我创建了自己的DataCollector课程:

class PermissionDataCollector extends DataCollector
{
    private $permissionCalls = array();

    private $permissionExtension;

    public function __construct(PermissionExtension $permissionExtension)
    {
        $this->permissionExtension = $permissionExtension;
    }

    /**
     * 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
     *
     * @api
     */
    public function collect(Request $request, Response $response, \Exception $exception = null)
    {
        $this->permissionCalls = $this->permissionExtension->getPermissionCalls();

        $this->data = array(
            'calls' => $this->permissionCalls
        );
    }
    public function getPermissionCallsCount()
    {
        return count($this->permissionCalls);
    }

    public function getFailedPermissionCallsCount()
    {
        return count(array_filter($this->permissionCalls, array(&$this, "filterForFailedPermissionCalls")));
    }

    private function filterForFailedPermissionCalls($var)
    {
        return $var['success'];
    }

    /**
     * Returns the name of the collector.
     *
     * @return string The collector name
     *
     * @api
     */
    public function getName()
    {
        return 'permission';
    }
}

PermissionExtension记录所有调用,然后我想 在PermissionDataCollector.

和一个刚刚输出的模板{{ collector.permissionCallsCount }}

该部分显示在工具栏中,但它只显示一个0错误。

我不确定我是否做得对,因为文档缺少这一部分。我正在使用 Symfony 2.1

有人用自定义数据扩展了工具栏吗?

4

1 回答 1

1

啊太棒了!有用。我基本上需要一直参考 $this->data 。

其原因是 ->data 被使用Symfony\Component\HttpKernel\DataCollector\DataCollector并序列化(参见 DataCollector::serialize)。

这稍后被存储(不知何故,我不知道在哪里,但它后来被反序列化)。如果您使用自己的属性,则DataCollector::unserialize只会修剪您的数据。

请参阅https://symfony.com/doc/current/profiler/data_collector.html#creating-a-custom-data-collector

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

只需要一直使用 $this->data,或者实现你自己的\Serializable序列化。

于 2017-11-27T21:12:11.337 回答