2017-02-15 154 views
3

實際上在我的項目中,如果用戶有請求,我需要在導航欄中顯示。要做到這一點我在樹枝模板使用:替代渲染(控制器())

{{ render(controller("AppBundle:TeamRequest:numberRequests")) }} 

控制器是非常簡單的,只是做一個學說的請求,並生成視圖。

但是這部分代碼很慢......比如果我禁用它多200ms。

有沒有更好的方法來做到這一點?

PS:有人知道什麼是Symfony \ Component \ HttpKernel \ EventListerner \ ProfilerListener?因爲這部分在主要和次要請求中花費了很多時間。

非常感謝:-)

多虧了答案,這個想法是做一個服務。在我的情況下,我沒有改變它,因爲正如你在圖中看到的那樣,時間的主要部分是調試欄,最後,它需要幾ms來生成它。

所有時間軸(閾值:50毫秒) enter image description here

只有子請求時間軸(閾值:1毫秒) enter image description here

+1

您是否嘗試在生產模式下運行請求? ProfilerListener的名稱建議用於在開發模式下對應用程序進行性能分析,並且不使用生產模式。 你可以通過運行來驗證這個: ''console debug:event-dispatcher --env = dev | grep Profiler''' '''console debug:event-dispatcher --env = prod | grep Profiler''' – zajca

+0

確切的說,它是Web調試工具欄的監聽器,我有一個疑問。這意味着最終做一個渲染(控制器())只需要15毫秒。 – mpiot

+0

那是因爲它是subrequest,symfony會創建另一個請求,它會重新加載整個框架和處理請求,這會花費很多時間,尤其是在dev環境中。你可以避免像下面的人一樣建議。但是您將無法使用ESI緩存您的請求。 – zajca

回答

2

嘗試這個功能移動到服務。然後把這個服務作爲一個全局變量註冊在twig中。 config.yml:

# Twig Configuration 
twig: 
    globals: 
     number_requests_service: %your_service_name% 

然後在樹枝可以加載它:

{{ number_request_service.renderSomething }} 

如果您需要在服務本身的用戶請求,然後給他們在服務配置request_stack。

+0

非常感謝:)我認爲這是一個好主意,在我的情況下,我認爲我不會改變,因爲最後,主要部分是調試工具欄。如果我們刪除它,它只需要幾ms就可以生成它。 – mpiot

0

我前幾天就遇到了同樣的問題,我用一個樹枝擴展來解決它,你可以像創建一個服務一樣創建它,並注入你的entityManager來完成你的請求並返回一個視圖。通過這種方式,Symfony2不會再次加載。