34
votes

I create my own FacebookBundle and

I got this error:

There is no extension able to load the configuration for "facebookbundle" (in /facebookx/app/config/config_dev.yml). Looked for namespace "facebookbundle", found "framework", "security", "twig", "monolog", "swiftmailer", "assetic", "doctrine", "sensio_framework_extra", "jms_aop", "jms_di_extra", "jms_security_extra", "d_facebook", "d_user", "d_security", "web_profiler", "sensio_distribution"

The error message means that I got an entry "facebookbundle" in My config.yml which is not used by any extension ?

My config.yml

facebookbundle:
    file:   %kernel.root_dir%/../src/FacebookBundle/Facebook/FacebookInit.php
    alias:  facebook
    app_id: xxx
    secret: xxx
    cookie: true
    permissions: [email, user_birthday, user_location, user_about_me]

My DFacebookExtension

<?php

namespace D\FacebookBundle\DependencyInjection;

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\Loader;

/**
 * This is the class that loads and manages your bundle configuration
 *
 * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html}
 */
class DFacebookExtension extends Extension
{
    /**
     * {@inheritDoc}
     */
    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.yml');

        foreach (array('app_id', 'secret', 'cookie', 'permissions') as $attribute) {
            $container->setParameter('facebookbundle.'.$attribute, $config[$attribute]);
        }

        if (isset($config['file']) && $container->hasDefinition('acebookbundle.api')) {
            $facebookApi = $container->getDefinition('facebookbundle.api');
            $facebookApi->setFile($config['file']);
        }
    }
}

were is error ?

4

4 Answers

72
votes

Also, keep in mind that the root key of the configuration file must be a normalized form of the Bundle's name.

This is something I've encoutered a few times and it's very frustrating to solve if you're not aware of it.

Example: if bundle is called MyFirstAwesomeBundle, then the root key in the file must be my_first_awesome. So camel-case is converted to snake-case and the word "bundle" is ignored or stripped away.

So simply having the root key in your file match exactly the value specified in Configuration::getConfigTreeBuilder() is not enough.

If you don't follow this rule, then you'll get the There is no extension able to load the configuration error.


I hope this will help the next desperate soul who ends up on this page...

24
votes

In order for custom config parameters to be accepted you have to define your bundle configuration using a Configuration.php class within your bundle.

src/FacebookBundle/DependencyInjection/Configuration.php:

<?php
namespace FacebookBundle\DependencyInjection;

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

/**
 * This is the class that validates and merges configuration from your app/config files
 *
 * To learn more see {@link http://symfony.com/doc/current/cookbook/bundles/extension.html#cookbook-bundles-extension-config-class}
 */
class Configuration implements ConfigurationInterface
{
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('facebookbundle');

        $rootNode
            ->children()
                ->scalarNode('file')->defaultValue('')->end()
                ->scalarNode('alias')->defaultValue('')->end()
                ->scalarNode('app_id')->defaultValue('')->end()
                ->scalarNode('secret')->defaultValue('')->end()
                ->booleanNode('cookie')->defaultTrue()->end()
                ->arrayNode('permissions')
                    ->canBeUnset()->prototype('scalar')->end()->end()
            ->end()
            ;

        return $treeBuilder;
    }
}
?>
13
votes

This happens when you forget to start the bundle in 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 Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
              new Symfony\Bundle\SecurityBundle\SecurityBundle(),
              new Symfony\Bundle\TwigBundle\TwigBundle(),
              new Symfony\Bundle\MonologBundle\MonologBundle(),
              new Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle(),
              new Symfony\Bundle\DoctrineBundle\DoctrineBundle(),
              new Symfony\Bundle\AsseticBundle\AsseticBundle(),
              new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(),
              new JMS\SecurityExtraBundle\JMSSecurityExtraBundle(),
              //...
              new D\FacebookBundle\DFacebookBundle(),
              //...
      );

      if (in_array($this->getEnvironment(), array ('dev', 'test')))
      {
         $bundles[] = new Symfony\Bundle\WebProfilerBundle\WebProfilerBundle();
         $bundles[] = new Sensio\Bundle\DistributionBundle\SensioDistributionBundle();
         $bundles[] = new Sensio\Bundle\GeneratorBundle\SensioGeneratorBundle();
      }

      return $bundles;
   }

   public function registerContainerConfiguration(LoaderInterface $loader)
   {
      $loader->load(__DIR__ . '/config/config_' . $this->getEnvironment() . '.yml');
   }

}
6
votes

This error can also be caused by a missing or invalid services key at the root of your config. It should look something like this:

services:
    foo_bar.baz:
        class: Foo\BarBundle\Service\BazService