2013-05-13 53 views
3

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

我有我想要的记录特定的方法调用,然后调试工具栏显示它们的服务。

我读了cookbook article,但它不是很有帮助。

我创建了自己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

有没有人扩展了自定义数据的工具栏?

+2

我不知道如何从内存中做到这一点,但我知道FOQElasticaBundle会显示ElasticSearch查询的日志,这将是一个很好的开始。 – Steve 2013-05-14 22:19:19

+0

啊太棒了!有用。我基本上需要始终引用'$ this-> data'。非常感谢捆绑参考! – 2013-05-15 09:31:11

+0

哈,拍摄和分数:)很高兴它帮助! – Steve 2013-05-18 13:19:08

回答

1

啊太棒了!有用。我基本上需要始终引用$ this->数据。

这样的原因 - >数据被Symfony\Component\HttpKernel\DataCollector\DataCollector和序列化使用(请参阅DataCollector :: serialize)。

这在以后存储(不知怎么的,我不知道在哪里,但后来反序列化)。如果你使用自己的属性DataCollector::unserialize只是修剪你的数据。

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

由于探查串行数据采集器的情况下,你不应该存储不能序列(如PDO对象)的对象,或者您需要提供自己的序列化()方法。

只需使用$ this->数据,或者实现您自己的\Serializable序列化。