如何让 Symfony 和 Twig 使用模板

How to get Symfony and Twig to use Templates

我是 Symfony 4 和 Twig 2 的新手。

我只想让扩展模板的基本功能发挥作用。

不幸的是,Symfony and Twig 的文档没有解释我在寻找什么(Twig 文档主要只是代码的集合,只有最少的解释)。或者我不明白... :)

这很简单。

我得到了通常的 base.html.twig:

base.html.twig

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>{% block title %}Welcome!{% endblock %}</title>
        {% block stylesheets %}{% endblock %}
    </head>
    <body>
        {% block body %}Old Content{% endblock %}
        {% block javascripts %}{% endblock %}
    </body>
</html>

我只在正文块中添加了一些默认文本。

下一个应该扩展上面文件的简单文件:

body.html.twig

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

{% block body %}
    New content
{% endblock %}

为了输出所有这些,我创建了一个控制器:

baseController.php

<?php
namespace App\Controller;

use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;

class baseController extends AbstractController
{
    /**
     * @Route("/")
     */
    public function base()
    {
        return $this->render('base.html.twig');
    }
}
?>

测试了 twigfiddle.com 中的模板,一切正常,所以它们肯定没问题。

上面的设置输出 base.html.twig 就好了(见 "Old Content" 文本,但完全忽略 body.html.twig。那么显而易见的问题是:我overlooking/which基本概念是什么我没有掌握?

感谢您的帮助。

base.html.twig 是您的骨架,body.html.twig 是您的页面特定实现。您的控制器应始终呈现 body.html.twig,这将覆盖在扩展 base.html.twig.

中找到的块

我脑海中的一些例子:

base.html.twig:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>{% block title %}Welcome!{% endblock %}</title>
        {% block stylesheets %}{% endblock %}
    </head>
    <body>
        {% include 'header.html.twig' %}

        {% block body %}{% endblock %}

        {% include 'footer.html.twig' %}
    </body>
    {% block javascripts %}{% endblock %}
</html>

home.html.twig:

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

{% block body %}
    <h1>header of this page</h1>

    {% include 'newsletter-subscribe.html.twig' %}

    {% include 'greeting.html.twig' with { name: 'Max' } %}

    <p>Some content</p>
{% endblock %}

greeting.html.twig:

Hello {{ name }}

只需自己创建页眉和页脚。确保在控制器中呈现 home.html.twig

如果您想深入研究它并且必须使用嵌套块,请使用 https://twig.symfony.com/doc/2.x/functions/parent.html

base.html.twig:

{% block body %}
    Hello World
{% endblock %}

home.html.twig:

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

{% block body %}
    {{ parent() }}
    how are you
{% endblock %}

应该输出Hello world how are you。不过,我不鼓励使用该功能,因为从设计师的角度来看,这种依赖关系并不明确。还要小心嵌入,它对树枝的影响比包含或简单块的影响更大。