如何覆盖一个包的任何部分

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 4.1,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

如何覆盖一个包的任何部分

在使用第三方包时,您可能希望自定义或覆盖其某些特性。本文档描述了覆盖包中最常见特性的方法。

提示

包覆盖机制意味着你不能使用物理路径来引用包的资源(例如。__DIR__ /配置/ services . xml).在你的包中总是使用逻辑路径(例如:@FooBundle /资源/配置/ services . xml),并致电locateResource()方法在需要时将它们转换为物理路径。

模板

中可以覆盖第三方包模板<您的项目> /模板/包/ < bundle-name > /目录中。新模板必须使用相同的名称和路径(相对于<包> /资源/视图/)作为原始模板。

例如,重写资源/视图/注册/ confirmed.html.twig从FOSUserBundle中创建这个模板:<您的项目> /模板/包/ FOSUserBundle /注册/ confirmed.html.twig

谨慎

如果在新位置添加模板,则需要五月需要清除你的高速缓存(PHP bin/控制台缓存:清除),即使您处于调试模式。

您可能只想覆盖一个或多个块,而不是覆盖整个模板。但是,由于您正在重写希望从中扩展的模板,因此将会出现一个无限循环错误。解决办法是使用特殊的模板名中的前缀告诉Symfony你想从原始模板扩展,而不是从被覆盖的模板ob娱乐下载:

1 2 3 4 5 6 7
{#模板/包/ FOSUserBundle /注册/ confirmed.html。树枝#}{#特别版'!'前缀可以避免从被覆盖的模板扩展时出现错误#}{%扩展“@ ! FOSUser /注册/ confirmed.html。树枝“%}{%some_block %}...{%endblock%}

提示

ob娱乐下载Symfony内部也使用一些包,因此您可以应用相同的技术来覆盖核心Symfony模板。例如,你可以定制错误页面覆盖TwigBundle模板。

路由

在Symfony中从不自动导入路由。ob娱乐下载如果你想要包含来自任何bundle的路由,那么它们必须从应用程序的某个地方手动导入(例如。配置/ routes.yaml).

“覆盖”一个包的路由最简单的方法就是根本不导入它。与其导入第三方包的路由,不如将该路由文件复制到应用程序中,修改它,然后导入它。

控制器

如果控制器是一个服务,请参阅下一节如何重写它。否则,定义一个新的路由+控制器,与你想要覆盖的控制器关联相同的路径(并确保新路由在bundle一个之前加载)。

服务与配置

如果您想修改由包创建的服务,可以使用装饰服务

如果您想要执行更高级的操作,例如删除由其他包创建的服务,则必须使用服务定义在一个编译器通过

实体和实体映射

如果一个bundle在配置文件中定义了它的实体映射,而不是注释,那么你可以像覆盖其他常规的bundle配置文件一样覆盖它们。唯一需要注意的是,您必须覆盖所有这些映射配置文件,而不仅仅是您实际想要覆盖的那些。

如果一个包提供了映射的超类(例如用户实体在FOSUserBundle)你可以覆盖它的属性和关联。了解有关此功能及其局限性的更多信息教义文档欧宝官网下载app

形式

现有的表单类型可以修改定义表单类型扩展

验证元数据

ob娱乐下载Symfony从每个bundle中加载所有验证配置文件,并将它们组合到一个验证元数据树中。这意味着您可以向属性添加新的约束,但不能覆盖它们。

为了克服这个问题,第三方捆绑包需要进行配置验证组.例如,FOSUserBundle就有这样的配置。要创建自己的验证,请将约束添加到新的验证组:

  • YAML
  • XML
1 2 3 4 5 6 7 8 9 10
#配置/验证器/ validation.yaml安全系数模型\ UserBundle \ \用户:属性:plainPassword:-NotBlank:组:(AcmeValidation)-长度:分钟:6minMessage:fos_user.password.short组:(AcmeValidation)

现在,更新FOSUserBundle配置,以便它使用您的验证组而不是原来的验证组。

翻译

翻译与包无关,而是与翻译领域.出于这个原因,您可以从主程序覆盖任何包翻译文件翻译/目录,只要新文件使用相同的域。

类中定义的转换资源/翻译/ FOSUserBundle.es.ymlFOSUserBundle文件,创建一个<您的项目> /翻译/ FOSUserBundle.es.yml文件。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。