2016-12-15 11 views
1

Iリンクとベーステンプレート(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

は 'base.html.twig'を拡張する' renderJs.js.twig'ですか? – rrubiorr81

答えて

0

これはどのようにすべての作業です(私はそれを理解):

  1. base.html.twigは、スクリプトタグ
  2. ユーザーのブラウザのソースにrenderJSアクションルートにURLを入れて、レンダリング生成されたページをロードし、スクリプトタグ内のrenderJSアクションのURLを見つけて、それを取得するためにサーバーに別のリクエストを行います。

この場合、base.html.twigレンダリングを取得するリクエストと、renderJS URLが与えるスクリプトファイルを取得するリクエストの2つのリクエストがあります。サーバーが2番目の要求を取得するまでに、最初の要求のコンテキストはなくなりました。

私は2つの選択肢が考えられます。オプション1は、コンテキストを再生成することです(理想的には、クラスまたはメソッドを両方の場所で実行するように設定することによって)。それはjavascriptファイルの2番目の要求(キャッシュ可能な場合など)を望み、コンテキストの生成にリソースがあまり多くない場合に便利です。

オプション2は、アクションの必要性をスキップして、base.html.twigテンプレートにrender.js.twigテンプレートをインラインJavaScriptとして含めることです。コンテキストが本当に高価で、javascriptが軽くて決してキャッシュされないのであれば、それはたぶん良い考えです(ただし、できるだけファイルをキャッシュできるようにする方がよいでしょう)。

私は彼らの声がどのように聞こえ、どのようにあなたに当てはまるのか教えてください。私は詳細を掘り下げることができます。

+0

私は両方のオプションを考慮しましたが、私はそれが別のものかどうか疑問に思っていました。 –

+0

1)コンテキストを再生成するには時間がかかりすぎる可能性がありますので、2番目のオプションはより良いでしょう: 2)スクリプトの行数が多いので、このように動作しますが、ソースコードのプレビューではよく見えません –

+0

redisやmemcachedのような?すべてのものがロードされている限り(私はDoctrineに読み込まれた遅延を考えています)、短い時間コンテキストを保存して、javascriptリクエストが来たらそれをチェックすることができます。 – skagzilla