Quelle est la différence entre use
et include
dans Twig?
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 dansblocks.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 %}
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.
l'explication est-elle correcte? y a-t-il d'autres explications à cette différence?
merci
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:
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>
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 %}
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 %}
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>
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 %}