【问题标题】:[Symfony + Twig][Symfony + Twig]
【发布时间】:2016-12-15 16:04:19
【问题描述】:

我有基本模板 (base.html.twig) 与动态生成的 js 的链接:

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

和渲染这个 JS 的 Action:

/**
     * @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(在 renderJs.js.twig 中具有与在 base.html.twig 中相同的变量)。 那可能吗?任何想法如何处理这个问题?

【问题讨论】:

  • renderJs.js.twig 扩展base.html.twig

标签: javascript php symfony twig


【解决方案1】:

这就是一切的运作方式(据我所知):

  1. base.html.twig 渲染,将 renderJS 动作路由的 URL 放入 script 标签的源中
  2. 用户浏览器加载生成的页面,并在脚本标签中找到 renderJS 操作的 URL,然后向服务器发出另一个请求以获取该 URL。

所以在这种情况下有两个请求:一个是获取 base.html.twig 渲染,另一个是获取 renderJS URL 提供的脚本文件。当服务器收到第二个请求时,第一个请求的上下文已经消失。

我可以想到两种选择。选项 1 是重新生成上下文(理想情况下,通过在两个地方设置一些类或方法来执行此操作)。如果您想对 javascript 文件进行第二次请求(例如是否可以缓存)并且生成上下文不是很耗费资源,那就太好了。

选项 2 是跳过该操作的需要,并将 render.js.twig 模板作为内联 JavaScript 包含在 base.html.twig 模板中。如果上下文的创建成本真的很高并且 javascript 很轻并且永远不会被缓存,那么这可能是一个好主意(但最好让文件尽可能多地被缓存)。

让我知道它们听起来如何以及它们如何适用于您,我可以深入了解更多细节。

【讨论】:

  • 是的,我已经考虑了这两种选择,但我想知道它是否是另一种。
  • 1) 重新生成上下文可能会花费太多时间,所以第二个选项会更好,但是:2) 有很多行脚本,它会以这种方式工作,但在源代码中看起来不太好预览
  • 使用redis或memcached之类的东西怎么样?只要所有内容都已加载(我认为 Doctrine 中的延迟加载是一个问题),您可以在短时间内存储上下文并在 javascript 请求进入时检查它。
猜你喜欢
  • 2017-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-06
  • 1970-01-01
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多