在symfony 3.4 / 4中覆盖另一个包中的包模板

时间:2018-05-30 13:26:47

标签: php symfony templates bundle

因为从Symfony 3.4开始不推荐使用bundle继承,并且将在4.0中删除,所以我找到了一个新的解决方案。我有:

  • 应用
  • FooBundle
  • BarBundle

我在应用程序中覆盖模板没有问题。但我需要在FooBundle中覆盖BarBundle中的模板。捆绑继承很容易,但我现在迷路了:)

我尝试了twig名称空间 - 没有成功,但我可能以错误的方式配置它。我的目标是在BarBundle中拥有基本模板,我可以在FooBundle或Application中重写这两个模板。 (这是因为BarBundle是第三方软件包,而FooBundle是我在许多项目中使用的软件包)。

没有bundle继承以及如何仍然可以吗?

感谢。

3 个答案:

答案 0 :(得分:4)

所以我最近需要相同的功能,并在评论@NicoHasse的帮助下,我设法制作实例

在捆绑包扩展类中,您需要实现PrependExtensionInterface,然后您可以修改树枝路径。然后,您需要知道您需要覆盖的原始命名空间(php bin/console debug:twig)。

你可以确认它使用twig debug命令,你应该在那个名称空间的第一个位置看到你的路径。

class YourExtensionClass extends Extension implements PrependExtensionInterface
{
    public function prepend(ContainerBuilder $container)
    {
        $container->loadFromExtension('twig', [
            'paths' => [
                '%kernel.project_dir%/vendor/xx/yy/zzz' => 'OriginalVNamespace',
            ]
        ]);

答案 1 :(得分:3)

这是一个更容易理解的例子

让我们先做一些假设

您的捆绑包名称: AcmeBundle

您要覆盖的捆绑包: FOSUserBundle

运行命令php bin/console debug:twig并找到要覆盖的捆绑软件的名称空间。在这种情况下,它是@FOSUser

您的捆绑包扩展名应如下所示

<?php // src/AcmeBundle/DependencyInjection/AcmeExtension.php

namespace AcmeBundle\DependencyInjection;

// ...

use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;

class AcmeExtension extends Extension implements PrependExtensionInterface
{
    // ...

    public function prepend(ContainerBuilder $container)
    {
        $container->loadFromExtension('twig', array(
            'paths' => array(
                '%kernel.project_dir%/src/AcmeBundle/Resources/FOSUserBundle/views' => 'FOSUser', // You use the namespace you found earlier here. Discard the `@` symbol.
            ),
        ));
    }
}

现在,您可以创建src/AcmeBundle/Resources/FOSUserBundle/views/Security/login.html.twig来覆盖FOSUserBundle的登录模板。

这只是FOSUserBundle的一个示例。您可以根据要覆盖的内容更改捆绑包名称。

答案 2 :(得分:0)

我将展示它在我的情况下的外观(Symfony 5.1)。要覆盖捆绑软件JMoseCommandSchedulerBudnleTwigBundle的视图,请执行以下操作:

1。使用自定义第三方捆绑模板创建您自己的目录(我将它们放在Resources/views/bundles中)

enter image description here

2。为每个要覆盖模板的包创建文件夹:

enter image description here

3。创建自定义模板(例如,创建自定义的Twig错误页面):

enter image description here

4。实施PrependExtensionInterface并将自定义路径添加到Twig Extension配置:

class AppngCmsExtension extends Extension implements PrependExtensionInterface {
    public function load(array $configs, ContainerBuilder $container)
    {
        $loader = new YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
        $loader->load('services.yaml');
    }

    public function prepend(ContainerBuilder $container)
    {
        // I recommend using FileLocator here 
        $thirdPartyBundlesViewFileLocator = (new FileLocator(__DIR__ . '/../Resources/views/bundles'));

        $container->loadFromExtension('twig', [
            'paths' => [
                $thirdPartyBundlesViewFileLocator->locate('JMoseCommandSchedulerBundle') => 'JMoseCommandScheduler',
                $thirdPartyBundlesViewFileLocator->locate('TwigBundle') => 'Twig',
            ],
        ]);
    }
}