如何覆盖包的一部分吗

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.0,不再维护。

这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。

如何覆盖包的一部分吗

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

路由

路由是从未在Symfony2自动导入。ob娱乐下载如果你想从任何包包括路线,然后他们必须手动从在您的应用程序(如进口。应用程序/配置/ 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 \ \翻译翻译

其次,如果类作为参数是不可用的,你要确保类总是覆盖当你的包使用,或者您需要修改的东西不仅仅是类名,您应该使用一个编译器通过:

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

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

看到如何使用编译器通过包如何使用编译器传递的信息。如果你想做一些除了覆盖类添加一个方法调用一样,你只能使用编译器传递方法。

实体和实体映射

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

形式

为了覆盖一种形式,它必须是注册为一个服务(这意味着它是标记为“form.type”)。你可以覆盖它你会覆盖任何服务中解释如何覆盖包的一部分吗。当然,这只会工作,如果类型被称为别名而不是被实例化,例如:

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

而不是:

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

验证元数据

在进步…

翻译

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

谨慎

最后翻译文件总是赢家。这意味着你需要确保包包含你的翻译后加载任何包的翻译你覆盖。这是完成的AppKernel

的文件是放在都会赢应用程序/资源/翻译,因为这些文件总是加载。

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。