如何在 Symfony 中创建带有错误模板的作曲家包?

How can I create a composer bundle with error templates in Symfony?

我们有一堆将在 Symfony 中创建的网络应用程序。为了使这更容易,我为模板创建了一个包。因此主文件 (TemplateBundle.php) 包含(删除注释):

<?php
namespace company\TemplateBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;

class TemplateBundle extends Bundle
{
}

然后在 Resources/views/template。html.twig 是主要的树枝模板,使用代码块来处理标题、内容区域等内容。

在应用程序中,我在 base.html.twig(所有其他 twig 文件扩展)中所做的一切是:

{# app/Resources/views/base.html.twig #}

{% extends 'TemplateBundle::template.html.twig' %}

{% block title %}App Name{% endblock %}

{% block content %}
    <div class="container page-content">{% block body %}{% endblock %}</div>
{% endblock %}

{% block stylesheets %}
    <link rel="stylesheet" href="{{ asset('css/appspecific.css') }}">
{% endblock %}

并且在部署时,当 composer 安装为 运行 时,此包会被安装,当模板更新时,所有应用程序都会更新到新版本并获得 re-deployed。到目前为止一切顺利。

我 运行 遇到问题的地方是当我想将错误页面添加到包中时。所以目前在应用程序中,它们位于 /app/Resources/TwigBundle/views/Exception/errorxxx.html.twig 例如 error404.html.twig:

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

{% block body %}
    <h1>That Page Could Not Be Found</h1>
    <p>It seems that you are trying to access a page that doesn't exist. Please check your spelling and try again.</p>
{% endblock %}

这样,错误页面会扩展带有标题等设置的基础,然后使用主站点模板扩展模板。因此,不必将错误页面添加到每个项目(并在错误页面的内容更改时更新每个项目),我想将它们添加到包中。

是否有一种简单的方法(在模板包中或者我可以创建另一个)来覆盖默认的 twig 错误页面?

如果没有简单的方法,还有哪些其他选择?

所以看起来答案是用我的包覆盖包。为此,我所做的就是将 TemplateBundle.php 修改为

<?php
namespace company\TemplateBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;

class TemplateBundle extends Bundle
{
    public function getParent()
    {
        return 'TwigBundle';
    }
}

然后,我可以根据需要替换模板、控制器等,所以我只是将我的错误模板(例如 error404.html.twig)放入 Resources/views/Exception 目录(与它们在TwigBundle 捆绑在 /vendor/symfony/symfony/src/Symfony/Bundle/TwigBundle) 中,并且因为它们扩展了 base.html.twig,它们现在看起来像应用程序的其余部分。