2016-12-15 2 views
1

Ich habe Basisvorlage (base.html.twig) mit Link auf dynamisch generierte js:[Symfony + Zweig]

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

und Aktion, die das macht 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') 
     ); 
    } 

Aber ich möchte JS mit dem gleichen Twig-Kontext wie in Basis-Vorlage (haben die gleichen Variablen in renderJs.js.twig wie in base.html.twig). Ist das möglich? Irgendwelche Ideen, wie man mit diesem Problem umgeht?

+0

ist 'renderJs.js.twig' erweitert' base.html.twig'? – rrubiorr81

Antwort

0

Dies ist, wie alles arbeiten (wie ich es verstehe):

  1. base.html.twig macht,
  2. Ein Benutzer Browser eine URL zur renderJS Aktion Route in die Quelle für das Script-Tag setzen lädt die generierte Seite und findet die URL für die renderJS-Aktion in einem Skript-Tag und fordert dann den Server auf, eine weitere Anfrage zu machen.

So gibt es zwei Anfragen in diesem Fall: die eine, um die base.html.twig Rendern zu erhalten, und dann eine andere Skript-Datei bekommen die renderJS URL gibt. Wenn der Server die zweite Anforderung erhält, ist der Kontext für die erste Anforderung verschwunden.

Ich kann mir zwei Möglichkeiten vorstellen. Option 1 besteht darin, den Kontext neu zu generieren (idealerweise indem Sie eine Klasse oder Methode einrichten, um dies an beiden Stellen zu tun). Das ist gut, wenn Sie eine zweite Anfrage für die Javascript-Datei haben möchten (wie wenn sie zwischengespeichert werden kann) und das Generieren des Kontextes nicht sehr ressourcenintensiv ist.

Option 2 besteht darin, die Aktion zu überspringen und die Vorlage render.js.twig in die Vorlage base.html.twig als Inline-Javascript einzufügen. Das ist wahrscheinlich nur eine gute Idee, wenn der Kontext sehr teuer zu erstellen ist und das Javascript leicht ist und niemals zwischengespeichert wird (aber es ist wahrscheinlich besser, die Datei so gut wie möglich zwischenspeichern zu lassen).

Lassen Sie mich wissen, wie sie klingen und wie sie auf Sie zutreffen und ich kann in mehr Details eingraben.

+0

Yup Ich habe beide Möglichkeiten in Betracht gezogen, aber ich fragte mich, ob es ein anderer ist. –

+0

1) Wiederherstellen Kontext wird wahrscheinlich zu viel Zeit, so zweite Option wird besser sein, aber: 2) gibt es viele Zeilen von Skripten, wird es so funktionieren, aber nicht gut aussieht in Quellcode-Vorschau –

+0

Was ist mit etwas zu verwenden wie redis oder memcached? Solange alles geladen ist (ich denke an faul geladen in Doctrine ist ein Problem), könnten Sie den Kontext für eine kurze Zeit speichern und überprüfen, wenn die Javascript-Anfrage kommt. – skagzilla

Verwandte Themen