[Symfony的+嫩枝]
我有链路基本模板(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中具有相同的变量)。 这可能吗?任何想法如何处理这个问题?
这是怎么了一切的工作(据我所知):
- base.html.twig渲染,把一个URL的renderJS行动路线到源脚本标记
- A的用户浏览器加载生成的页面,并在脚本标记中查找renderJS操作的URL,然后向服务器发出另一个请求以获取该页面。
因此,在这种情况下有两个请求:一个获取base.html.twig渲染,然后另一个获取renderJS URL提供的脚本文件。当服务器获得第二个请求时,第一个请求的上下文已经消失。
我可以考虑两种选择。选项1是重新生成上下文(理想情况是通过设置一些类或方法在两个地方执行)。如果你想要第二个javascript文件的请求(比如它可以被缓存)并且生成上下文不是非常耗费资源,那么这很好。
选项2将跳过对动作的需求,并将inline javascript中的render.js.twig模板包含在base.html.twig模板中。这可能只是一个好主意,如果上下文的创建非常昂贵,并且JavaScript很轻而且永远不会被缓存(但最好让文件尽可能缓存)。
让我知道他们的声音以及它们如何适用于您,我可以深入了解更多细节。
是的我已经考虑过这两个选项,但我想知道它是否是另一个选项。 –
1)重新生成上下文可能会花费太多时间,所以第二个选项会更好,但: 2)有很多行脚本,它将以这种方式工作,但在源代码预览中看起来不太好 –
如何使用某些东西像redis或memcached?只要所有东西都加载了(我正在考虑延迟加载Doctrine是一个问题),您可以在短时间内存储上下文,并在javascript请求进入时检查它。 – skagzilla
是'renderJs.js.twig'扩展'base.html.twig'吗? – rrubiorr81