因为从Symfony 3.4开始不推荐使用bundle继承,并且将在4.0中删除,所以我找到了一个新的解决方案。我有:
我在应用程序中覆盖模板没有问题。但我需要在FooBundle中覆盖BarBundle中的模板。捆绑继承很容易,但我现在迷路了:)
我尝试了twig名称空间 - 没有成功,但我可能以错误的方式配置它。我的目标是在BarBundle中拥有基本模板,我可以在FooBundle或Application中重写这两个模板。 (这是因为BarBundle是第三方软件包,而FooBundle是我在许多项目中使用的软件包)。
没有bundle继承以及如何仍然可以吗?
感谢。
答案 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)。要覆盖捆绑软件JMoseCommandSchedulerBudnle
和TwigBundle
的视图,请执行以下操作:
1。使用自定义第三方捆绑模板创建您自己的目录(我将它们放在Resources/views/bundles
中)
2。为每个要覆盖模板的包创建文件夹:
3。创建自定义模板(例如,创建自定义的Twig错误页面):
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',
],
]);
}
}