首页 > 解决方案 > Symfony 3 - 覆盖包模板 - prependPath 不起作用

问题描述

我正在将现有的迁移Symfony 2.8Symfony 3.4. 目前我正在使用包继承来扩展FOSUserBundle我自己的自定义实现的一些功能。

这在Symfony 2.8和中都可以正常工作Symfony 3.4。但是,不推荐使用捆绑继承,并且希望为我的项目做好准备,以便将来更新到Symfony 4.

我知道我可以将我想要覆盖的模板移动MyUserBundle/Resources/views/...app/Resources/FOSUserBundle/views/.... 但是,我想将文件保存在我自己的包(或 SF 4 中的 src 文件夹)中,以提高可重用性。

根据另一个问题的提示,我尝试使用 aCompilerPass将我的包中的路径添加到搜索路径:

// src/MyUserBundle/MyUserBundle.php
class MyUserBundle extends Bundle { 
    //public function getParent() {
    //    return 'FOSUserBundle';
    //}

    public function build(ContainerBuilder $container) {
        parent::build($container);  
        $container->addCompilerPass(new OverrideCompilerPass());
    }
}

// src/MyUserBundle/DependencyInjection/Compiler/OverrideCompilerPass.php
public function process(ContainerBuilder $container) {
    $path = dirname(__DIR__, 2).'/Resources/views';
    $twigFilesystemLoaderDefinition = $container->findDefinition('twig.loader.native_filesystem');
    $twigFilesystemLoaderDefinition->addMethodCall('prependPath', array($path, 'FOSUser'));
}

但是,这不起作用。找不到模板,Symfony 使用默认的 FOS 模板。调试器显示:

  // bin/console debug:twig WITH bundle inheritance
  @FOSUser    src/AppUserBundle/Resources/views/                                             
              vendor/friendsofsymfony/user-bundle/Resources/views/    

  // bin/console debug:twig WITHOUT bundle inheritance
  @FOSUser    vendor/friendsofsymfony/user-bundle/Resources/views/   

所以添加编译器通道没有任何区别:当禁用包继承时,模板只会在 FOS 文件夹中搜索......

如何解决这个问题?是使用app/Resources/...唯一的选项还是可以将文件保存在我自己的捆绑目录中?

标签: phpsymfonytwig

解决方案


推荐阅读