我试图用自己的方法覆盖核心Symfony组件。我正在使用的方法是:
"autoload": {
"psr-0": {
"": "src/",
"Symfony": "src/vendor/symfony/src/"
}
}
然而,当我运行composer update并安装它时,似乎从未考虑过这一点。这不是强制自动加载器在Symfony核心之前首先查看另一个目录的正确方法吗?
任何指示赞赏!
编辑:文件路径
的src /供应商/ symfony的/ SRC / Symfony的/网桥/枝条/扩展/ TranslationExtension.php
的src /供应商/ symfony的/ SRC / Symfony的/组件/翻译/ Translator.php SRC /供应商/ symfony的/ SRC / Symfony的/组件/翻译/装载机/ 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
但是我不确定我需要设置哪些参数来加载扩展类来代替核心。
答案 0 :(得分:4)
我终于找到了答案。
首先,如果您需要找出要覆盖的类,请转到:
symfony/src/Symfony/Bundle/FrameworkBundle/Resources/%Your file to override%.xml
在那里,您将找到可以扩展/覆盖的可能Symfony类的列表。
然后在你的config.yml add中(我选择将我的扩展命名空间放入):
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"
}
},