【问题标题】:Symfony 2.1 Extending Core ClassesSymfony 2.1 扩展核心类
【发布时间】:2012-09-26 19:16:20
【问题描述】:

我正在尝试用我自己的覆盖 Symfony 的核心组件。我使用的方法是:

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

但是,当我运行 composer update 并安装时,它似乎从未考虑到这一点。这难道不是强制自动加载器在 Symfony 核心之前先查看另一个目录的正确方法吗?

任何指针表示赞赏!

编辑:文件路径

src/vendor/symfony/src/Symfony/Bridge/Twig/Extension/TranslationExtension.php

src/vendor/symfony/src/Symfony/Component/Translation/Translator.php src/vendor/symfony/src/Symfony/Component/Translation/Loader/YamlFileLoader.php

<?php

// autoload_namespaces.php generated by Composer

$vendorDir = dirname(__DIR__);
$baseDir = dirname($vendorDir);

return array(
    'Twig_Extensions_' => $vendorDir . '/twig/extensions/lib/',
    'Twig_' => $vendorDir . '/twig/twig/lib/',
    'Symfony\\Bundle\\SwiftmailerBundle' => $vendorDir . '/symfony/swiftmailer-bundle/',
    'Symfony\\Bundle\\MonologBundle' => $vendorDir . '/symfony/monolog-bundle/',
    'Symfony\\Bundle\\AsseticBundle' => $vendorDir . '/symfony/assetic-bundle/',
    'Symfony' => array($vendorDir . '/symfony/symfony/src/', '/src/vendor/symfony/src/'),
    'SessionHandlerInterface' => $vendorDir . '/symfony/symfony/src/Symfony/Component/HttpFoundation/Resources/stubs',
    'Sensio\\Bundle\\GeneratorBundle' => $vendorDir . '/sensio/generator-bundle/',
    'Sensio\\Bundle\\FrameworkExtraBundle' => $vendorDir . '/sensio/framework-extra-bundle/',
    'Sensio\\Bundle\\DistributionBundle' => $vendorDir . '/sensio/distribution-bundle/',
    'Monolog' => $vendorDir . '/monolog/monolog/src/',
    'Metadata\\' => $vendorDir . '/jms/metadata/src/',
    'JMS\\SecurityExtraBundle' => $vendorDir . '/jms/security-extra-bundle/',
    'JMS\\DiExtraBundle' => $vendorDir . '/jms/di-extra-bundle/',
    'JMS\\AopBundle' => $vendorDir . '/jms/aop-bundle/',
    'Doctrine\\ORM' => $vendorDir . '/doctrine/orm/lib/',
    'Doctrine\\DBAL' => $vendorDir . '/doctrine/dbal/lib/',
    'Doctrine\\Common' => $vendorDir . '/doctrine/common/lib/',
    'Doctrine\\Bundle\\DoctrineBundle' => $vendorDir . '/doctrine/doctrine-bundle/',
    'CG\\' => $vendorDir . '/jms/cg/src/',
    'Assetic' => $vendorDir . '/kriswallsmith/assetic/src/',
    '' => $baseDir . '/src/',
);

如果我手动将自动加载行编辑为:

'Symfony' => array('/Users/macbook/Sites/Opia/Gaia/src/vendor/symfony/src/', $vendorDir . '/symfony/symfony/src/'),

一切都按预期进行。所以现在基本上是找到作曲家为什么不能正确作曲的解决方案了。

编辑 2:

多做一些搜索,上面的方法似乎不是一个好的实现:

https://groups.google.com/forum/#!msg/composer-dev/HprRV_wJZg4/M_zQ8O7lB6IJ

相反,我需要扩展给定的类并告诉 Symfony 使用这些类,这应该可以通过参数实现:

parameters: 
security.authentication.listener.anonymous.class: Acme\DemoBundle 
\Security\Http\Firewall\AcmeAnonymousAuthenticationListener

但是我不确定需要设置哪些参数来加载扩展类来代替核心​​。

【问题讨论】:

  • 你的文件在src/vendor/symfony/src/里面的路径是什么?
  • 用路径编辑了我的原始帖子。我想这就是你的意思,如果不让知道的话。
  • 能否也加入vendor/composer/autoload_namespaces.php
  • 已添加,路径似乎在那里,它应该在另一个之前吗?
  • 是的,它应该在主要的之前。你的 composer.phar 是最新的吗?您可以通过运行composer self-update 来更新它

标签: php symfony symfony-2.1 composer-php


【解决方案1】:

我终于找到了答案。

首先,如果您需要找出要覆盖的类,请转到:

symfony/src/Symfony/Bundle/FrameworkBundle/Resources/%Your file to override%.xml

您将在此处找到可以扩展/覆盖的可能 Symfony 类的列表。

然后在您的 config.yml 中添加(我选择将我的放在扩展命名空间中):

parameters:
  twig.extension.trans.class: Extend\Symfony\Bridge\Twig\Extension\TranslationExtension
  translation.loader.yml.class: Extend\Symfony\Component\Translation\Loader\YamlFileLoader
  translator.class: Extend\Symfony\Bundle\FrameworkBundle\Translation\Translator

终于在我的 composer.json 中:

"autoload": {
    "psr-0": { 
                "": "src/",
                "Extend\\Symfony": "/path/to/your/symfony/classes"
             }
},

【讨论】:

  • 这确实是一种更好的方法,依赖名称冲突来覆盖类意味着您不能扩展原始类,但必须复制粘贴整个代码,这几乎不是最可维护的解决方案.
  • 你应该仍然可以通过简单地将基类称为不同的东西来扩展类:使用 Symfony/path/to/Translator 作为 SymphonyTranslator。然后 Translator 扩展 SymfonyTranslator(我还没有测试过,但似乎可以正常工作)
猜你喜欢
  • 2023-03-12
  • 2013-08-14
  • 2015-12-03
  • 2013-07-01
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-22
相关资源
最近更新 更多