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

编辑本页

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

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

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

本文档是关于如何覆盖第三方包的不同部分的快速参考。

路由

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

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

控制器

假设涉及的第三方包使用非服务控制器(几乎总是这样),您可以通过包继承轻松重写控制器。有关更多信息,请参见如何使用包继承覆盖一个包的部分.如果控制器是一个服务,请参阅下一节如何重写它。

服务与配置

为了覆盖/扩展服务,有两个选项。首先,您可以将保存服务类名的参数设置为您自己的类应用程序/配置/ config.yml.当然,这只有在类名被定义为包含服务的包的服务配置中的参数时才有可能。例如,重写用于Symfony的类ob娱乐下载翻译服务,您将重写translator.class参数。确切地知道要覆盖哪个参数可能需要一些研究。类中定义和使用的参数资源/ config / translation.xml文件在核心FrameworkBundle:

  • YAML
  • XML
  • PHP
1 2 3
# app / config / config.yml参数:translator.class:Acme \ HelloBundle \ \翻译翻译

其次,如果类不能作为参数使用,你想要确保类在使用bundle时总是被重写,或者如果你需要修改类名以外的东西,你应该使用编译器传递:

12 3 4 5 6 7 8 9 10 11 12 13 14
/ / src / Acme / DemoBundle / DependencyInjection /编译器/ OverrideServiceCompilerPass.php名称空间AcmeDemoBundleDependencyInjection编译器使用ob娱乐下载组件DependencyInjection编译器CompilerPassInterface使用ob娱乐下载组件DependencyInjectionContainerBuilderOverrideServiceCompilerPass实现了CompilerPassInterface公共函数过程(ContainerBuilder容器定义容器->getDefinition (“original-service-id”);定义->setClass (“Acme \ DemoBundle \ YourService”);}}

在本例中,您获取原始服务的服务定义,并将其类名设置为您自己的类。

看到如何与编译器传递在捆绑有关如何使用编译器传递的信息。如果你想做一些超出重写类的事情——比如添加一个方法调用——你只能使用编译器pass方法。

实体和实体映射

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

形式

为了覆盖表单类型,必须将其注册为服务(这意味着它被标记为form.type).然后可以覆盖它,就像覆盖任何服务一样,如如何覆盖一个包的任何部分.当然,这只有在类型通过别名引用而不是实例化时才会起作用,例如:

1
构建器->add (“名字”“custom_type”);

而不是:

1
构建器->add (“名字”CustomType ());

验证元数据

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

要覆盖这一点,第三方包需要配置验证组.例如,FOSUserBundle就有这样的配置。要创建自己的验证,请将约束添加到新的验证组:

  • YAML
  • XML
1 2 3 4 5 6 7 8 9 10
# src / Acme / UserBundle /资源/ config / validation.yml安全系数模型\ UserBundle \ \用户:属性:plainPassword:-NotBlank:组:(AcmeValidation)-长度:分钟:6minMessage:fos_user.password.short组:(AcmeValidation)

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

翻译

翻译与包无关,而是与域相关。这意味着您可以覆盖任何翻译文件的翻译,只要它在正确的域名

谨慎

最后一个翻译文件总是胜出。这意味着您需要确保包包含你的翻译在任何你重写其翻译的包之后加载。这是在AppKernel

总是胜出的文件是被放入的文件应用程序/资源/翻译,因为这些文件总是最后加载的。

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