Twig: render vs include

Estoy creando una tienda en línea. Tengo un problema de rendimiento si utilizo la función twig “render” en lugar de “incluir”.

Aquí está el código que muestra un catálogo de productos:

controlador de catálogo:

getDoctrine() ->getRepository('StoreBundle:Product') ->createQueryBuilder('product') ->select('partial product.{id, token, name}') ->innerJoin('product.categoryRelation', 'categoryRelation') ->where('categoryRelation.category = :category_id'); $qb->setParameters(array( 'category_id' => $category->getId(), )); $products = $qb->getQuery() ->getResult(); return $this->render('StoreBundle:Product\Catalog:product.html.twig', array( 'category' => $category, 'products' => $products, )); } } 

… plantilla para controlador de catálogo:

 {# src/Acme/StoreBundle/Resources/views/Product/Catalog/product.html.twig #} {% extends 'AcmeDemoBundle::layout.html.twig' %} {% block content %} 

{{ category.name }}

    {% for product in products %}
  • {#% render "StoreBundle:Product:show" with { product: product } %#} {% include "StoreBundle:Product:show.html.twig" with { product: product } %}
  • {% endfor %}
{% endblock %}

… controlador de producto:

  $product); } } 

… plantilla simple (pero más compleja en el futuro) para el controlador del producto:

 {# src/Acme/StoreBundle/Resources/views/Product/show.html.twig #} {{ product.name }} 

Entonces si uso:

 {% include "StoreBundle:Product:show.html.twig" with { product: product } %} 

… todo bien: 147ms y 4608Kb de memoria.

Pero cuando necesito un controlador para mostrar el producto:

 {% render "StoreBundle:Product:show" with { product: product } %#} 

… mi script consume demasiado tiempo y memoria: 3639ms y 17664Kb de memoria!

¿Cómo boost la velocidad y reducir el consumo de memoria utilizando el controlador?

Cada llamada de renderización genera una nueva solicitud, con el problema de degradación del rendimiento que está describiendo. No creo que haya mucho que puedas hacer al respecto, sino que uses el almacenamiento en caché de esi, para que los fragmentos individuales provenientes de las llamadas de renderización se puedan almacenar en caché. De lo contrario, podría intentar revisar su lógica para reducir el uso de llamadas de renderizado.

Corrígeme si estoy equivocado, pero la idea básica es que incluya básicamente “copiar y pegar” su contenido en lugar del comando.

Mientras que el comando de renderizado debe crear primero el controlador, inicializarlo, ejecutar la función correspondiente, etc. Entonces, ¿quién sabe qué artillería pesada está escondida dentro de las clases, constructores, etc. del controlador o de los padres?

También recuerde que incluso las plantillas incluidas se representan. Así que incluso puede obtener recursiones o algo similar cuando renderiza desde ramitas. Personalmente trato de evitar representar algo que esté fuera del retorno del controlador.

Además, como lo menciona Louis-Philippe Huberdeau en sus comentarios, el entorno de desarrollo puede diferir drásticamente del modo prod debido a las diferentes opciones y registros.

En cuanto a los consejos, intente evitar poner lógica en sus controladores, o intente usar objetos estáticos que a menudo se usan en los controladores para reutilizarlos en lugar de crearlos nuevos una y otra vez. Y renderizar cosas solo desde controladores

    Intereting Posts