2013-04-03 79 views
0

我想越過部分FOSElasticaExtension https://github.com/FriendsOfSymfony/FOSElasticaBundle來處理配置和參數,通過bundle繼承有點不同(這裏稍微描述一下http://symfony.com/doc/master/cookbook/bundles/override.html)。不幸的是,這方面的文檔是缺乏的,並且在嘗試覆蓋時出現奇怪的錯誤(比如完全沒有注入配置)。如何覆蓋bundle的DependencyInjection部分?

vendor/acme/Acme/ElasticaBundle/AcmeElasticaBundle.php

<?php 
namespace Acme\ElasticaBundle; 

use Symfony\Component\HttpKernel\Bundle\Bundle; 

/** 
* Extends FOS Elastica bundle. 
*/ 
class AcmeElasticaBundle extends Bundle 
{ 
    public function getParent() 
    { 
     return 'FOSElasticaBundle'; 
    } 
} 

vendor/acme/Acme/ElasticaBundle/DependencyInjection/Configuration.php

<?php 
namespace Acme\ElasticaBundle\DependencyInjection; 

use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; 
use Symfony\Component\Config\Definition\Builder\TreeBuilder; 
use Symfony\Component\Config\Definition\ConfigurationInterface; 

use FOS\ElasticaBundle\DependencyInjection\Configuration as BaseConfiguration; 

class Configuration extends BaseConfiguration 
{ 
} 

vendor/acme/Acme/ElasticaBundle/DependencyInjection/AcmeElasticaExtension.php

<?php 
namespace Acme\ElasticaBundle\DependencyInjection; 

use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; 
use Symfony\Component\DependencyInjection\ContainerBuilder; 
use Symfony\Component\DependencyInjection\Definition; 
use Symfony\Component\DependencyInjection\DefinitionDecorator; 
use Symfony\Component\DependencyInjection\Reference; 
use Symfony\Component\Config\FileLocator; 

use FOS\ElasticaBundle\DependencyInjection\FOSElasticaExtension as Extension; 

/** 
* Overrides some parts of FOS Elastica extension. 
*/ 
class AcmeElasticaExtension extends Extension 
{ 
} 

app/AppKernel.php

<?php 
use Symfony\Component\HttpKernel\Kernel; 
use Symfony\Component\Config\Loader\LoaderInterface; 

class AppKernel extends Kernel 
{ 
    public function registerBundles() 
    { 
     $bundles = array(
      new FOS\ElasticaBundle\FOSElasticaBundle(), 
      new Acme\ElasticaBundle\PhoenixElasticaBundle(), 
     ); 
    } 
} 

錯誤:

ErrorException: Notice: Undefined index: indexes in /home/tatsh/test-site/vendor/friendsofsymfony/elastica-bundle/FOS/ElasticaBundle/DependencyInjection/Configuration.php line 367 

也就是說這一行:https://github.com/FriendsOfSymfony/FOSElasticaBundle/blob/master/DependencyInjection/Configuration.php#L367

我沒有改變我的配置,所以我不知道什麼可能是原因。我認爲他們的代碼驗證配置運行良好和檢索值,但MergeExtensionConfigurationPass似乎與這個正確去:

in /home/tatsh/test-site/vendor/friendsofsymfony/elastica-bundle/FOS/ElasticaBundle/DependencyInjection/Configuration.php line 367 
at ErrorHandler->handle('8', 'Undefined index: indexes', '/home/tatsh/test-site/vendor/friendsofsymfony/elastica-bundle/FOS/ElasticaBundle/DependencyInjection/Configuration.php', '367', array('nestings' => array())) in /home/tatsh/test-site/vendor/friendsofsymfony/elastica-bundle/FOS/ElasticaBundle/DependencyInjection/Configuration.php line 367 
at Configuration->getNestings() in /home/tatsh/test-site/vendor/friendsofsymfony/elastica-bundle/FOS/ElasticaBundle/DependencyInjection/Configuration.php line 283 
at Configuration->getMappingsNode() in /home/tatsh/test-site/vendor/friendsofsymfony/elastica-bundle/FOS/ElasticaBundle/DependencyInjection/Configuration.php line 265 
at Configuration->getTypesNode() in /home/tatsh/test-site/vendor/friendsofsymfony/elastica-bundle/FOS/ElasticaBundle/DependencyInjection/Configuration.php line 188 
at Configuration->addIndexesSection(object(ArrayNodeDefinition)) in /home/tatsh/test-site/vendor/friendsofsymfony/elastica-bundle/FOS/ElasticaBundle/DependencyInjection/Configuration.php line 30 
at Configuration->getConfigTreeBuilder() in /home/tatsh/test-site/vendor/symfony/symfony/src/Symfony/Component/Config/Definition/Processor.php line 52 
at Processor->processConfiguration(object(Configuration), array(array())) in /home/tatsh/test-site/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/DependencyInjection/Extension.php line 103 
at Extension->processConfiguration(object(Configuration), array(array())) in /home/tatsh/test-site/vendor/friendsofsymfony/elastica-bundle/FOS/ElasticaBundle/DependencyInjection/FOSElasticaExtension.php line 23 
at FOSElasticaExtension->load(array(array()), object(ContainerBuilder)) in /home/tatsh/test-site/vendor/symfony/symfony/src/Symfony/Component/DependencyInjection/Compiler/MergeExtensionConfigurationPass.php line 42 
at MergeExtensionConfigurationPass->process(object(ContainerBuilder)) in /home/tatsh/test-site/vendor/symfony/symfony/src/Symfony/Component/HttpKernel/DependencyInjection/MergeExtensionConfigurationPass.php line 39 
at MergeExtensionConfigurationPass->process(object(ContainerBuilder)) in /home/tatsh/test-site/vendor/symfony/symfony/src/Symfony/Component/DependencyInjection/Compiler/Compiler.php line 119 
at Compiler->compile(object(ContainerBuilder)) in /home/tatsh/test-site/vendor/symfony/symfony/src/Symfony/Component/DependencyInjection/ContainerBuilder.php line 453 
at ContainerBuilder->compile() in /home/tatsh/test-site/app/bootstrap.php.cache line 950 
at Kernel->buildContainer() in /home/tatsh/test-site/app/bootstrap.php.cache line 859 
at Kernel->initializeContainer() in /home/tatsh/test-site/app/bootstrap.php.cache line 571 
at Kernel->boot() in /home/tatsh/test-site/app/bootstrap.php.cache line 614 
at Kernel->handle(object(Request)) in /home/tatsh/test-site/web/app_dev.php line 28 

回答

0

簡單的方法來解決:實現load()方法即使存根。不要致電父母load()方法。

<?php 
/** 
* Overrides some parts of FOS Elastica extension. 
*/ 
class AcmeElasticaExtension extends Extension 
{ 
    public function load(array $configs, ContainerBuilder $container) 
    { 
    } 
}