鍍金池/ 教程/ PHP/ 如何創(chuàng)建一個自定義的數(shù)據(jù)收集器
如何以非繼承方式自定義方法
如何創(chuàng)建事件監(jiān)聽器
如何以非繼承方式擴展一個類
如何記錄消息到不同的文件
如何掌握并創(chuàng)建新的環(huán)境
如何使用 Doctrine DBAL
"XXX is deprecated" E-USER-DEPRECATED 的警告是什么意思?
在登錄表單中使用 CSRF 保護
如何注冊自定義 DQL 函數(shù)
如何為表單類配置空數(shù)據(jù)
如何嵌入集合表單
如何創(chuàng)建自定義認證提供者
如何使用 Apache Router
如何組織配置文件
部署在 Microsoft Azure 云
如何在路由參數(shù)中允許"/"字符
如何在安全,路由,服務(wù)和驗證中使用表達式
如何對顯示控制臺信息配置 Monolog
如何為一個 Bundle 創(chuàng)建友好的配置
如何改變默認的目標(biāo)路徑行為
如何在運行測試之前自定義引導(dǎo)過程
如何從路由向控制器傳輸額外的信息
如何從數(shù)據(jù)庫(實體提供者)讀取安全用戶
如何從 Controller 調(diào)用一個命令
如何創(chuàng)建自定義表單密碼驗證器
如何使用內(nèi)建的 PHP Web 服務(wù)器
如何在功能測試中用 Token 模擬認證
配置 Session 文件的保存目錄
理解前端控制器、內(nèi)核及環(huán)境如何協(xié)同工作
如何實現(xiàn)一個簡單的注冊表單
如何使用 Doctrine 擴展:Timestampable, Sluggable, Translatable 等等
如何使用多個實體管理器和連接
如何自定義表單渲染
如何安裝第三方 Bundles
使用預(yù)認證安全防火墻
如何簡化多個 Bundle 的配置
會話代理實例
安裝 Composer
如何冒充一個用戶
如何注冊一個新的請求格式和 MIME 類型
如何在功能測試中使用分析器
如何在服務(wù)容器內(nèi)設(shè)置外部參數(shù)
如何重寫 Symfony 默認的目錄結(jié)構(gòu)
如何在一個 Symfony 控制器中創(chuàng)建一個 SOAP 的 Web 服務(wù)
如何使用序列化
部署在 Platform.sh
升級一個副版本
如何寫一個自定義的 Twig 擴展
如何在 SubVersion 中創(chuàng)建并保存一個 Symfony 項目
使用 PHP 庫聯(lián)合,編譯和最小化 Web 資產(chǎn)
如何創(chuàng)建一個自定義的數(shù)據(jù)收集器
如何使用和注冊命名空間路徑
如何使用 Monolog 記錄日志
如何建立一個傳統(tǒng)的登錄表單
如何強制路由總是使用 HTTPS 或者 HTTP
如何在模板中使用 PHP 而不是 Twig
如何動態(tài)選擇密碼加密算法
避免匿名用戶開始 Session 會話
如何測試 Doctrine 倉庫
如何在功能測試中測試一封電子郵件被發(fā)送
Symfony2 與 Symfony1 的區(qū)別
使用結(jié)尾反斜線重定向 URL
(configuration)如何在數(shù)據(jù)庫中使用 PdoSessionHandler 存儲 Sessions
如何使用匹配器有條件地啟用分析器
部署在 Heroku 云
如何不用自定義控制器配置重定向
如何在 Bundle 內(nèi)部加載服務(wù)配置
如何處理不同的錯誤級別
如何在應(yīng)用中保護服務(wù)和方法
如何對表單單元測試
如何把命令定義為服務(wù)
如何配置 Monolog 從日志中排除 404 錯誤
如何使用控制臺
如何測試與數(shù)據(jù)庫交互的代碼
如何在路由中使用除了 GET 和 POST 的 HTTP 方法
如何使用云服務(wù)發(fā)送電子郵件
如何創(chuàng)建一個控制臺命令
在遺留的應(yīng)用上使用 Symfony Session
如何使用高級的訪問控制列表
如何不用一個自定義的控制器渲染一個模板
如何重寫部分 Bundle
升級一個主版本
安全訪問控制是如何工作的
如何使用 Bundle 的繼承來重寫部分 Bundle
如何使用 Voter 檢查用戶權(quán)限
如何為多個 Doctrine 的實現(xiàn)提供模型類
如何使用作用域
如何部署一個 Symfony 應(yīng)用
如何用 "inherit-data" 減少代碼冗余
如何注冊事件監(jiān)聽器和訂閱
使用 Bower 安裝 Symfony
如何創(chuàng)建一個自定義路由加載器
如何創(chuàng)建一個自定義的驗證限制
在獨立注入類中使用參數(shù)
如何使用 Assetic 和 Twig Functions 進行圖像優(yōu)化
如何利用表單事件動態(tài)修改表單
如何在過濾器的前后設(shè)置事件分發(fā)器
如何在 Bundle 中使用 Compiler Passes
緩存包含 CSRF 保護表單的頁面
如何注入變量到所有的模板(如全局變量)
如何創(chuàng)建一個自定義表單域類型
如何限定防火墻使其只允許通過指定請求
如何把 Controller 定義為服務(wù)
如何使用 Gmail 發(fā)送郵件
升級一個補丁版本
如何創(chuàng)建一個表單類型擴展
如何對不同的 URL 強制使用 HTTPS 或者 HTTP
如何使用 Varnish 加速我的 Web 站點
如何定義虛擬類和接口之間的關(guān)系
如何自定義登錄表單
如何測試多個客戶端的交互
PSR-7 Bridge
如何使用 YUI Compressor 裁剪 Javascripts 和 Stylesheets
在用戶的 Session 中使用局部 "Sticky"
如何定制錯誤頁
如何從已存在的數(shù)據(jù)庫中生成實體
如何用 Doctrine 上傳文件
可復(fù)用 Bundles 的最佳實踐
如何發(fā)送一封電子郵件
如何將 Assetic Filter 應(yīng)用到具體的文件擴展名上
切換分析器存儲
如何上傳文件
限制 Session 元數(shù)據(jù)的寫入
如何使用多用戶提供者
如何使用數(shù)據(jù)轉(zhuǎn)換
配置一個 Web 服務(wù)器
如何編程訪問分析器數(shù)據(jù)
如何在路由中使用服務(wù)容器參數(shù)
如何在控制臺生成 URL 和發(fā)送郵件
如何將你的開發(fā)環(huán)境優(yōu)化為調(diào)試環(huán)境
如何在控制臺命令中啟用日志
如何在功能測試中模擬 HTTP 認證
如何使用 API 驗證用戶
如何移除 AcmeDemoBundle
控制臺命令
如何配置 Symfony 使其工作在負載均衡和反轉(zhuǎn)代理
如何添加“記住我”登錄功能
如何使用 Assetic 進行資產(chǎn)管理
如何限定防火墻使其接受指定主機
如何使用訪問控制列表(ACLs)
如何裁剪 CSS/JS 文件(使用 UglifyJS 和 UglifyCSS)
如何緩存電子郵件
如何使用 submit() 函數(shù)處理表單提交
如何在 Git 中創(chuàng)建并保存一個 Symfony 項目
如何創(chuàng)建自定義用戶提供者
如何對電子郵件錯誤配置 Monolog
如何在開發(fā)時使用電子郵件

如何創(chuàng)建一個自定義的數(shù)據(jù)收集器

Symfony 的分析器將數(shù)據(jù)采集功能委托給數(shù)據(jù)收集器。Symfony 在默認上捆綁了一些數(shù)據(jù)收集器,但是你可以很容易地按照自己的需求創(chuàng)建自定義的收集器。

創(chuàng)建一個自定義的數(shù)據(jù)收集器

創(chuàng)建一個自定義的數(shù)據(jù)收集器,所需要做的實質(zhì)工作就是實現(xiàn)數(shù)據(jù)收集器接口類 DataCollectorInterface

interface DataCollectorInterface
{
    /**
     * 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
     */
    function collect(Request $request, Response $response, \Exception $exception = null);

    /**
     * Returns the name of the collector.
     *
     * @return string The collector name
     */
    function getName();
}

上述的 getName() 方法返回值必須是一個獨一無二的名字。這是被用來之后進行信息訪問的依據(jù)(可以在功能測試章節(jié)查看如何使用分析器文檔來獲得使用實例)。

而 collect() 方法負責(zé)存儲想要被提供給局部屬性的數(shù)據(jù)。

未探查序列化數(shù)據(jù)采集器的情況下,你不應(yīng)該存儲不可序列化的對象(如 PDO 對象),或者你需要提供自己的 serialize() 方法。

大部分的時間,擴展數(shù)據(jù)采集器和填充 $this->數(shù)據(jù)屬性(它需要序列化 $this->數(shù)據(jù)屬性)是非常方便的:

class MemoryDataCollector extends DataCollector
{
    public function collect(Request $request, Response $response, \Exception $exception = null)
    {
        $this->data = array(
            'memory' => memory_get_peak_usage(true),
        );
    }

    public function getMemory()
    {
        return $this->data['memory'];
    }

    public function getName()
    {
        return 'memory';
    }
}

使自定義數(shù)據(jù)收集器生效

為使一個數(shù)據(jù)收集器生效,將它添加進你的一個配置表中的常規(guī)服務(wù),并把它附屬在 data_collector 之后:

YAML:

services:
    data_collector.your_collector_name:
        class: Fully\Qualified\Collector\Class\Name
        tags:
            - { name: data_collector }

XML:

<service id="data_collector.your_collector_name" class="Fully\Qualified\Collector\Class\Name">
    <tag name="data_collector" />
</service>

PHP:

$container
    ->register('data_collector.your_collector_name', 'Fully\Qualified\Collector\Class\Name')
    ->addTag('data_collector')
;

添加網(wǎng)絡(luò)分析器模板

當(dāng)你想在網(wǎng)絡(luò)調(diào)試工具條或網(wǎng)絡(luò)分析器上顯示你的數(shù)據(jù)收集器收集的數(shù)據(jù),您將需要創(chuàng)建一個 Twig 模板。下面的例子可以幫助你開始:

{% extends 'WebProfilerBundle:Profiler:layout.html.twig' %}

{% block toolbar %}
    {# This toolbar item may appear along the top or bottom of the screen.#}
    {% set icon %}
    <span class="icon"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAcCAQAAADVGmdYAAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQffAxkBCDStonIVAAAAGXRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QV4EOFwAAAHpJREFUOMtj3PWfgXRAuqZd/5nIsIdhVBPFmgqIjCuYOrJsYtz1fxuUOYER2TQID8afwIiQ8YIkI4TzCv5D2AgaWSuExJKMIDbA7EEVhQEWXJ6FKUY4D48m7HYU/EcWZ8JlE6qfMELPDcUJuEMPxvYazYTDWRMjOcUyAEswO+VjeQQaAAAAAElFTkSuQmCC" alt=""/></span>
    <span class="sf-toolbar-status">Example</span>
    {% endset %}

    {% set text %}
    <div class="sf-toolbar-info-piece">
        <b>Quick piece of data</b>
        <span>100 units</span>
    </div>
    <div class="sf-toolbar-info-piece">
        <b>Another quick thing</b>
        <span>300 units</span>
    </div>
    {% endset %}

    {# Set the "link" value to false if you do not have a big "panel"
       section that you want to direct the user to. #}
    {% include '@WebProfiler/Profiler/toolbar_item.html.twig' with { 'link': true } %}

{% endblock %}

{% block head %}
    {# Optional, if you need your own JS or CSS files. #}
    {{ parent() }} {# Use parent() to keep the default styles #}
{% endblock %}

{% block menu %}
    {# This left-hand menu appears when using the full-screen profiler. #}
    <span class="label">
        <span class="icon"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAcCAQAAADVGmdYAAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQffAxkBCDStonIVAAAAGXRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QV4EOFwAAAHpJREFUOMtj3PWfgXRAuqZd/5nIsIdhVBPFmgqIjCuYOrJsYtz1fxuUOYER2TQID8afwIiQ8YIkI4TzCv5D2AgaWSuExJKMIDbA7EEVhQEWXJ6FKUY4D48m7HYU/EcWZ8JlE6qfMELPDcUJuEMPxvYazYTDWRMjOcUyAEswO+VjeQQaAAAAAElFTkSuQmCC" alt=""/></span>
        <strong>Example Collector</strong>
    </span>
{% endblock %}

{% block panel %}
    {# Optional, for showing the most details. #}
    <h2>Example</h2>
    <p>
        <em>Major information goes here</em>
    </p>
{% endblock %}

每個塊都是可選的。工具欄塊用于網(wǎng)頁調(diào)試工具,菜單和面板用于將一個面板添加到網(wǎng)絡(luò)分析器中。

所有塊都有訪問收集器對象的權(quán)限。

內(nèi)置的模板使用 Base64 編碼的圖像工具欄:

   <img src="data:image/png;base64,..." />  

你可以很容易利用這個小腳本計算出圖像的 base64 值:

   #!/usr/bin/env php
   <?php
   echo base64_encode(file_get_contents($_SERVER['argv'][1]));

為了使模板生效,在您配置的 data_collector 標(biāo)簽中添加模板屬性。例如,假設(shè)你的模板是在一些 AcmeDebugBundle 中,那么:

YAML:

services:
    data_collector.your_collector_name:
        class: Acme\DebugBundle\Collector\Class\Name
        tags:
            - { name: data_collector, template: "AcmeDebugBundle:Collector:templatename", 

XML:

<service id="data_collector.your_collector_name" class="Acme\DebugBundle\Collector\Class\Name">
    <tag name="data_collector" template="AcmeDebugBundle:Collector:templatename" id="your_collector_name" />
</service>

PHP:

$container
    ->register('data_collector.your_collector_name', 'Acme\DebugBundle\Collector\Class\Name')
    ->addTag('data_collector', array(
        'template' => 'AcmeDebugBundle:Collector:templatename',
        'id'       => 'your_collector_name',
    ))
;

記得確保你的 ID 屬性與用于 getname() 方法的字符串相同。