Eğer bazı konfigürasyon parametrelerini dependency injection dosyalarında tanımlamak isterseniz, aşağıdaki örneği takip edebilirsiniz. Bu tarz işlemleri genelde kişisel vendor bundle yarattığımız zaman yaparız çünkü, vendor bundle içinde config.yml veya parameters.yml gibi konfigürasyon dosyalarının barınacağı app klasörü bulunmaz. Varsayalım ki ana uygulamamızın ismi Football, kişisel uygulamamızın ismi ise Team olsun.

Daha fazla bilgi için burayı, burayı, burayı, burayı ve burayı okuyabilirsiniz.


Football config.yml


Eğer ana Football uygulamasının config.yml dosyasındaki bazı parametrelerini kişisel olarak yarattığınız Team vendor bundle içinde de kullanmak isterseniz, Football config.yml içindeki node isminin Team vendor bundle içindeki tree builder ismine uyması gerekir. Aşağıdaki parametrelere daha sonra Team vendor bundle içinden ulaşacağız.


# football/app/config/config.yml
application_backend: # This is the name which matches the name in config.php of bundle
name: inanzzz
domain: inanzzz.com
my_message: Hello

Configuration.php


Yukarıdaki konfigürasyon bilgilerine Team vendor bundle içinden ulaşacağımız için, onları önce kayıt altına almamız lazım.


namespace TeamBundle\DependencyInjection;

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

class Configuration implements ConfigurationInterface
{
public function getConfigTreeBuilder()
{
$treeBuilder = new TreeBuilder();
$rootNode = $treeBuilder->root('application_backend');

$rootNode
->children()
->scalarNode('name')->isRequired()->cannotBeEmpty()->end()
->scalarNode('domain')->isRequired()->cannotBeEmpty()->end()
->scalarNode('my_message')->isRequired()->cannotBeEmpty()->end()
->end();

return $treeBuilder;
}
}

TeamBundleExtension.php


Aşağıda da gördüğümüz gibi, prependSpecialConfigDependentExtension() methodu ana Football uygulamamızda tanımladığımız konfigürasyon bilgileri ile ilişkilendirilmiştir ama, prependSpecialConfigIndependentExtension() methodu ana Football uygulamamızdan tamamen bağımsızdır.


namespace TeamBundle\DependencyInjection;

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

class ApplicationBackendExtension extends Extension implements PrependExtensionInterface
{
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'));
foreach (['services.yml', 'controllers.yml', 'repositories.yml', 'factories.yml', 'listeners.yml'] as $service) {
$loader->load($service);
}
}

public function prepend(ContainerBuilder $container)
{
$configs = $container->getExtensionConfig($this->getAlias());

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

$this->prependSpecialConfigDependentExtension($container, $config);
$this->prependSpecialConfigIndependentExtension($container);
}

/**
* As you can see this access config parameters of parent application
*/
private function prependSpecialConfigDependentExtension(ContainerBuilder $container, array $config)
{
$container->prependExtensionConfig(
'my_internal_config_extension',
[
'level_one' =>
[
'level_two' => [
'my_name' => $config['name']
],
'my_domain' => $config['domain']
],
'my_special_message' => $config['my_message'],
'another' => 'hello'
]
);
}

/**
* As you can see this has nothing to do with parent application
*/
private function prependSpecialConfigIndependentExtension(ContainerBuilder $container)
{
$container->prependExtensionConfig(
'my_independent_config_extension',
[
'level_one' =>
[
'level_two' => [
'my_name' => 'inanzzz'
],
'my_domain' => 'inanzzz.com'
],
'my_special_message' => 'Welcome',
'another' => 'Back'
]
);
}
}