【问题标题】:How can I override Core Symfony2 Classes?如何覆盖 Core Symfony2 类?
【发布时间】:2012-07-12 22:16:55
【问题描述】:

我想覆盖一个核心 Symfony2 类。

具体来说,我想覆盖 vendor/symfony/symfony/src/Symfony/Bundle/FrameworkBundle/Templating/TemplateReference.php,TemplateReference,这样我就可以更改它找到模板的位置。这是否可能,如果可以,如何?

【问题讨论】:

  • 例如..我想自动检测移动设备,如果用户来自移动设备,我想看看等效的模板文件是否在views/mobile/而不是/ views/ .. 我提到的确切文件包含查找树枝模板路径位置的类。

标签: symfony


【解决方案1】:

不要这样做,除非你确切地知道你在做什么,并且你 100% 确定你不会破坏某些东西......

如果您使用 Symfony 2.0 类加载器组件:

$loader->registerNamespaces(array(
    'Symfony' => array(
        __DIR__.'/../src/vendor/symfony/src',
        __DIR__.'/../vendor/symfony/src',
        __DIR__.'/../vendor/bundles',
    ),
    ...
));

要使用 composer 执行此操作,这应该可以,编辑您的 composer.json 文件:

"autoload": {
    "psr-0": {
         "": "src/",
         "Symfony": "src/vendor/symfony/src/"
    }
},

这告诉自动加载器,当它尝试从Symfony 命名空间加载一个类时,首先查看您的src/vendor/symfony/src,然后查看vendor/symfony/src,然后查看vendor/bundles ...

然后复制你想要编辑的文件:

src/vendor/symfony/src/Symfony/Bundle/FrameworkBundle/Templating/TemplateReference.php

【讨论】:

  • Symfony 同时依赖作曲家自动加载机制。
  • 是的,但他的问题被标记为 2.0 而不是 2.1 :)
  • ehm ... 以“但 2.0 也使用作曲家”开始评论,但我很明智地先看看它。你完全正确。
  • 他说你们都必须在 2.1 上使用 composer 以不同的方式执行此操作,但这很容易实现。
  • 如何使用 2.1 做到这一点?我想我应该特别提到 2.1,但我现在不想为此写一个新问题。 :)
【解决方案2】:

您可以轻松覆盖一些定义为服务的类(您可以检查 app/cache/dev/appDevDebugProejctContainer.xml),并覆盖您的 parameter.ini 上的服务名称。

但如果类没有像这样定义,您可以创建自己的“补丁”,在作曲家更新后应用。

很多人会说编辑核心类很脏,但如果你想要好的性能,它通常是实现它的唯一解决方案;-),它简单、快速和容易。

欢迎其他解决方案..

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
  • 2012-05-08
相关资源
最近更新 更多