2016-12-15 161 views
1

我有鏈路基本模板(base.html.twig)動態生成的js:[Symfony的+嫩枝]

<script type="text/javascript"> 
 
    <script type="text/javascript" src="{{ path('renderJs') }}"></script> 
 
</script>

和行動這使得這個JS:

/** 
    * @Route("/scripts.js", 
    * name="renderJs") 
    */ 
    public function renderJsAction(Request $request) 
    { 
     return new Response(
      $this->renderView(
       "AcmeBundle:Default:renderJs.js.twig", 
       array('foo' => 'bar') 
      ), 
      200, 
      array('Content-Type' => 'text/javascript') 
     ); 
    } 

但我想要使用與基本模板中相同的Twig上下文來渲染JS(在base.html.twig中在renderJs.js.twig中具有相同的變量)。 這可能嗎?任何想法如何處理這個問題?

+0

是'renderJs.js.twig'擴展'base.html.twig'嗎? – rrubiorr81

回答

0

這是怎麼了一切的工作(據我所知):

  1. base.html.twig渲染,把一個URL的renderJS行動路線到源腳本標記
  2. A的用戶瀏覽器加載生成的頁面,並在腳本標記中查找renderJS操作的URL,然後向服務器發出另一個請求以獲取該頁面。

因此,在這種情況下有兩個請求:一個獲取base.html.twig渲染,然後另一個獲取renderJS URL提供的腳本文件。當服務器獲得第二個請求時,第一個請求的上下文已經消失。

我可以考慮兩種選擇。選項1是重新生成上下文(理想情況是通過設置一些類或方法在兩個地方執行)。如果你想要第二個javascript文件的請求(比如它可以被緩存)並且生成上下文不是非常耗費資源,那麼這很好。

選項2將跳過對動作的需求,並將inline javascript中的render.js.twig模板包含在base.html.twig模板中。這可能只是一個好主意,如果上下文的創建非常昂貴,並且JavaScript很輕而且永遠不會被緩存(但最好讓文件儘可能緩存)。

讓我知道他們的聲音以及它們如何適用於您,我可以深入瞭解更多細節。

+0

是的我已經考慮過這兩個選項,但我想知道它是否是另一個選項。 –

+0

1)重新生成上下文可能會花費太多時間,所以第二個選項會更好,但: 2)有很多行腳本,它將以這種方式工作,但在源代碼預覽中看起來不太好 –

+0

如何使用某些東西像redis或memcached?只要所有東西都加載了(我正在考慮延遲加載Doctrine是一個問題),您可以在短時間內存儲上下文,並在javascript請求進入時檢查它。 – skagzilla