如何覆盖包的一部分吗

编辑该页面

如何覆盖包的一部分吗

使用第三方包时,您可能想要定制或覆盖它的一些特性。本文档描述的方法覆盖的最常见的特性包。

提示

包覆盖机制意味着你不能使用物理路径指的是包的资源(如__DIR__ /配置/ services . xml)。总是在你的包(如使用逻辑路径。@FooBundle /配置/ services . xml)和调用locateResource()方法在需要的时候把它们变成物理路径。

模板

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

例如,覆盖模板/注册/ confirmed.html.twig从AcmeUserBundle模板,创建这个模板:<您的项目> /模板/包/ AcmeUserBundle /注册/ confirmed.html.twig

谨慎

如果你在一个新的位置添加一个模板,你可能需要明确你的缓存(php bin /控制台缓存:清楚),即使你在调试模式下。

而不是覆盖整个模板,你可能只是想覆盖一个或多个块。然而,由于你是压倒一切你想要的模板扩展,你会在一个无限循环的错误。解决方案是使用特殊的!前缀的模板名称告诉Symfony,您想要扩展从原来的模板,而不是覆盖:欧宝娱乐app下载地址

1 2 3 4 5 6 7
{#模板/包/ AcmeUserBundle /注册/ confirmed.html。树枝#}{#特别的!的前缀时避免错误从一个覆盖模板#}{%扩展“@ ! AcmeUser /注册/ confirmed.html。树枝“%}{%some_block %}{%endblock%}

提示

欧宝娱乐app下载地址Symfony内部也使用一些包,所以你可以使用相同的技术覆盖核心Symfony模板。例如,您可以自定义错误页面覆盖TwigBundle模板。

路由

在Symfony路由是不会自动导入。欧宝娱乐app下载地址如果你想从任何包包括路线,然后他们必须手动从在您的应用程序(如进口。配置/ routes.yaml)。

最简单的方法“覆盖”一捆的路由是从来没有进口。而不是导入第三方包的路由、路由文件复制到您的应用程序,修改它,并导入它。

控制器

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

服务和配置

如果你想修改服务创建一个包,您可以使用装饰服务

如果你想做更高级的操作,比如删除服务由其他包,你必须一起工作服务定义在一个编译器通过

实体和实体映射

压倒一切的实体映射是唯一可能的如果一个包提供了一个超类(如映射用户实体FOSUserBundle)。可以覆盖属性和关联。了解更多关于这个特性及其局限性教义的文档欧宝体育电话

形式

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

验证元数据

欧宝娱乐app下载地址Symfony加载所有验证配置文件从每个包和结合成一个验证元数据树。这意味着您可以添加新的约束属性,但不能覆盖它们。

为了克服这一点,第三方包需要配置验证组。例如,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配置,所以它使用你的验证组而不是原始的。

翻译

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

例如,覆盖中定义的翻译翻译/ AcmeUserBundle.es.yamlAcmeUserBundle文件,创建一个<您的项目> /翻译/ AcmeUserBundle.es.yaml文件。

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
欧宝娱乐app下载地址Symfony 6.2支持通过苏禄人
欧宝娱乐app下载地址Symfony 6.2支持通过Les-Tilleuls.coop