Bundle Konfiguration innerhalb des Bundles laden


Damit die Bundle unabhängig voneinander funktioneiren und man Abhängigkeiten vermeidet, sollte ein Bundle sein eigenen Konfigurationen beinhalten

z.B. : src/MyBundle/Resources/config/config.yml

aber auch selber laden.

Das Laden der Konfiguration ist über den DependencyInjection Container möglich.

Beispiel:

Die folgende config soll geladen werden. Sie enthält eigene Bundle-Parametern und benutzen Extension Parametern:

my_bundle:   #Naming Convention!
  modules:

extension_x:
  param: "foo.html.twig"

Es müssen 2 Dateien angelegt werden:

src/MyBundle/DependencyInjection/MyExtension.php:

namespace MyBundle\DependencyInjection;

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

/**
 * This is the class that loads and manages bundle configuration.
 */
class ApyExtension extends Extension implements PrependExtensionInterface
{
    /**
     * {@inheritdoc}
     */
    public function load(array $configs, ContainerBuilder $container)
    {

        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

        $container->setParameter('my_bundle.modules', $config['modules']);

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

    public function prepend(ContainerBuilder $container)
    {
        $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
        $loader->load('config.yml');
    }
}

und src/MyBundle/DependencyInjection/Configuration.php:

namespace MyBundle\DependencyInjection;

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

/**
 * This is the class that validates and merges configuration from app/config files.
 */
class Configuration implements ConfigurationInterface
{
    /**
     * {@inheritdoc}
     */
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('my_bundle');

        $rootNode
            ->children()
                ->arrayNode('modules')
                    ->defaultValue([])
                        ->prototype('variable')
                    ->end()
                ->end()
            ->end();

        return $treeBuilder;
    }
}

Dann kann im Controller auf die Configuration zugegriffen werden:

$configuration = $this->getParameter('my_bundle.modules');

Hinweis:

Bei mir musste noch die MyBundle\MyBundle angepasst werden, damit die load() Methode aufgerufen wird.

namespace MyBundle;

use ApyBundle\DependencyInjection\ApyExtension;
use Symfony\Component\HttpKernel\Bundle\Bundle;

class MyBundle extends Bundle
{
    /**
     * @return MyExtension
     */
    public function getContainerExtension()
    {
        return new MyExtension();
    }
}

Hinterlasse eine Antwort

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>