web-dev-qa-db-fra.com

Différence entre inclure, étendre, utiliser, macro, incorporer dans Twig

Quelle est la différence entre use et include dans Twig?

Documentation :

comprendre

L'instruction include inclut un modèle et renvoie le contenu rendu de ce modèle dans le modèle actuel:

{% include 'header.html' %}
Body here...
{% include 'footer.html' %}

utilisation

L'instruction use indique à Twig d'importer les blocs définis dans blocks.html dans le modèle actuel (c'est comme les macros, mais pour les blocs):

blocks.html

{% block sidebar %}{% endblock %}

main.html

{% extends "base.html" %}
{% use "blocks.html" %}
{% block title %}{% endblock %}
{% block content %}{% endblock %}

Réponse possible:

Je pense que this devrait expliquer la différence:

include consiste à récupérer tout le code d'un fichier externe et à l'importer dans votre fichier réel au bon endroit de l'appel.

use est complètement différent car il analyse le fichier lié pour trouver une section particulière de code, puis écrase les blocs portant le même nom, dans votre fichier actuel, avec celui trouvé dans ce fichier externe.

include est comme " allez chercher ce fichier et rendez-le ici avec ma page ".

use est " analyser cet autre fichier pour trouver les définitions de bloc à utiliser à la place des miennes définies ici ".

Si la commande use ne trouve rien correspondant à la tâche, rien ne s'affiche du tout dans ce fichier.


Question

l'explication est-elle correcte? y a-t-il d'autres explications à cette différence?

merci

18
Pmpr

Après des mois, je poste une réponse pour toute référence supplémentaire à cette question. J'ai également ajouté une description de extends & import & macro & embed pour plus de clairance:

Il existe différents types d'héritage et de réutilisation de code dans Twig:

Comprendre

L'objectif principal est réutilisation du code. Pensez à utiliser header.html.twig & footer.html.twig à l'intérieur base.html.twig par exemple.

header.html.twig

<nav>
   <div>Homepage</div>
   <div>About</div>
</nav>

base.html.twig

{% include 'header.html.twig' %}
<main>{% block main %}{% endblock %}</main>

S'étend

L'objectif principal est héritage vertical. Pensez à étendre base.html.twig à l'intérieur homepage.html.twig et about.html.twig par exemple.

base.html.twig

{% include 'header.html.twig' %}
<main>{% block main %}{% endblock %}</main>

homepage.html.twig

{% extends 'base.html.twig' %}

{% block main %}
<p>You are at the homepage</p>
{% endblock %}

about.html.twig

{% extends 'base.html.twig' %}

{% block main %}
<p>You are at the about page</p>
{% endblock %}

Utilisation

L'objectif principal est réutilisation horizontale. Pensez à utiliser sidebar.html.twig à l'intérieur single.product.html.twig (étend product.layout.html.twig) et single.service.html.twig (étend service.layout.html.page) pages. (c'est comme des macros, mais pour des blocs)

sidebar.html.twig

<aside>{% block sidebar %}{% endblock %}</aside>

single.product.html.twig

{% extends 'product.layout.html.twig' %}

{% use 'sidebar.html.twig' %}
{% block main %}
<p>You are at the product page for product number 123</p>
{% endblock %}

single.service.html.twig

{% extends 'service.layout.html.twig' %}

{% use 'sidebar.html.twig' %}
{% block main %}
<p>You are at the service page for service number 456</p>
{% endblock %}

Macro

L'objectif principal est avoir un balisage réutilisable sur de nombreux modèles avec des variables. Considérons une fonction qui obtient des variables et génère du balisage.

form.html.twig

{% macro input(name, value, type) %}
    <input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" }}" />
{% endmacro %}

profile.service.html.twig

{% import "forms.html.twig" as forms %}

<div>{{ forms.input('username') }}</div>

Intégrer

L'objectif principal est remplacement de bloc. Il a la fonctionnalité de Use et Include ensemble. Pensez à intégrer pagination.html.twig dans product.table.html.twig & service.table.html.twig.

pagination.html.twig

<div>
    <div>{% block first %}{% endblock %}</div>
    {% for i in (min + 1)..(max - 1) %}
        <div>{{ i }}</div>
    {% endfor %}
    <div>{% block last %}{% endblock %}</div>
</div>

product.table.html.twig

{% set min, max = 1, products.itemPerPage %}

{% embed 'pagination.html.twig' %}
    {% block first %}First Product Page{% endblock %}
    {% block last %}Last Product Page{% endblock %}
{% endembed %}

service.table.html.twig

{% set min, max = 1, services.itemPerPage %}

{% embed 'pagination.html.twig' %}
    {% block first %}First Service Page{% endblock %}
    {% block last %}Last Service Page{% endblock %}
{% endembed %}

Veuillez noter que le fichier incorporé (pagination.html.twig ici) a accès au contexte actuel (min, max variables ici). Vous pouvez également transmettre des variables supplémentaires au fichier incorporé:

pagination.html.twig

<p>{{ count }} items</p>
<div>
    <div>{% block first %}{% endblock %}</div>
    {% for i in (min + 1)..(max - 1) %}
        <div>{{ i }}</div>
    {% endfor %}
    <div>{% block last %}{% endblock %}</div>
</div>

product.table.html.twig

{% set min, max = 1, products|length %}

{% embed 'pagination.html.twig' with {'count': products|length } %}
    {% block first %}First Product Page{% endblock %}
    {% block last %}Last Product Page{% endblock %}
{% endembed %}
45
Pmpr