2

コアの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 / Translater.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

ただし、コアの代わりに拡張クラスをロードするために設定する必要のあるパラメーターがわかりません。

4

1 に答える 1

4

私はついにこれに対する答えを見つけました。

まず、オーバーライドするクラスを見つける必要がある場合は、次の場所に移動します。

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"
             }
},
于 2012-10-06T15:39:05.933 に答える