Twig: render vs include

Sto creando un negozio online. Ho un problema di prestazioni se uso la funzione di ramatura “render” invece di “include”.

Ecco il codice che mostra un catalogo prodotti:

controller di catalogo:

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

… modello per controller di catalogo:

 {# 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 %}

… controller del prodotto:

      $product); } } 

    … modello semplice (ma più complesso in futuro) per controller di prodotto:

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

    Quindi se uso:

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

    … tutto ok: 147 ms e memoria 4608 KB.

    Ma quando ho bisogno di un controller per visualizzare il prodotto:

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

    … la mia sceneggiatura consuma troppo tempo e memoria: 3639ms e 17664Kb di memoria!

    Come aumentare la velocità e ridurre il consumo di memoria utilizzando il controller?

    Ogni chiamata di rendering genera una nuova richiesta, con il problema di degrado delle prestazioni che stai descrivendo. Non penso che ci sia molto da fare in proposito, ma usando il caching esi, in modo che i singoli frammenti provenienti dalle chiamate di rendering possano essere memorizzati nella cache. Altrimenti potresti provare a rivedere la tua logica per ridurre l’utilizzo delle chiamate di rendering.

    Correggimi se ho torto, ma l’idea di base è che include sostanzialmente “copia-incolla” il suo contenuto al posto del comando.

    Mentre il comando render deve prima creare il controller, inizializzarlo, eseguire la funzione corrispondente, ecc. Quindi chi sa quale artiglieria pesante è nascosta all’interno delle classi di questo controllore o genitore, costruttori e così via?

    Ricorda inoltre che anche i modelli inclusi sono resi. Quindi potresti persino ottenere ricorsioni o qualcosa di simile quando esegui il rendering da un twig. Personalmente cerco di evitare di eseguire rendering al di fuori del ritorno del controller.

    Inoltre, come menzionato da Louis-Philippe Huberdeau nei commenti, l’ambiente di sviluppo può differire drasticamente dalla modalità di produzione a causa delle diverse opzioni e della registrazione.

    Per quanto riguarda i consigli, prova a evitare di inserire la logica nei controller o prova a utilizzare oggetti statici che vengono spesso utilizzati nei controller per riutilizzarli invece di crearne di nuovi più e più volte. E renderizza roba solo dai controller