2016-12-15 4 views
1

У меня есть шаблон базы (base.html.twig) со ссылкой на динамически генерируемые JS:[Symfony + Twig]

<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') 
     ); 
    } 

Но я хочу визуализировать JS с тем же контекстом Twig, что и в базовом шаблоне (имеют те же переменные в renderJs.js.twig, что и в base.html.twig). Возможно ли это? Любые идеи, как справиться с этой проблемой?

+0

is 'renderJs.js.twig' расширение' base.html.twig'? – rrubiorr81

ответ

0

Это как рабочий Everything (как я понимаю):

  1. base.html.twig делает, помещая URL в маршрут renderJS действий в источник для сценария тега
  2. пользователей браузера загружает созданную страницу и находит URL-адрес для действия renderJS в теге скрипта, а затем делает другой запрос на сервер, чтобы получить это.

Таким образом, в этом случае есть два запроса: один, чтобы получить рендеринг base.html.twig, а затем другой, чтобы получить файл сценария, который дает URL-адрес renderJS. Когда сервер получит второй запрос, контекст для первого исчезнет.

Я могу представить два варианта. Вариант 1 состоит в том, чтобы регенерировать контекст (в идеале, имея некоторый класс или метод, настроенный для этого в обоих местах). Это хорошо, если вы хотите получить второй запрос для javascript-файла (например, если он может быть кэширован), а генерация контекста не очень ресурсоемкая.

Вариант 2 - пропустить необходимость действия и включить шаблон render.js.twig в шаблон base.html.twig как встроенный javascript. Это, вероятно, только хорошая идея, если контекст действительно дорог для создания, а javascript является легким и никогда не будет кэшироваться (но, вероятно, лучше позволить файлу получить кеширование столько, сколько он может).

Дайте мне знать, как они звучат и как они могут применяться к вам, и я могу вникать в подробности.

+0

Yup Я рассматриваю оба варианта, но мне было интересно, если это еще один. –

+0

1) Регенерирующий контекст, вероятно, займет слишком много времени, поэтому второй вариант будет лучше, но: 2) есть много строк сценариев, он будет работать таким образом, но не выглядит хорошо в исходном коде предварительного просмотра –

+0

Как насчет использования чего-то как redis или memcached? Пока все загружено (я думаю, что ленивый загружен в Doctrine является проблемой), вы можете сохранить контекст на короткое время и проверить его, когда приходит запрос javascript. – skagzilla