开发者

Can I include an optional config file in Symfony2?

I want to make a local config file, config_local.yml, that allows each development environment to be configured correctly without screwing up other people's dev environments. I want it to be a separate开发者_Go百科 file so that I can "gitignore" it and know that nothing essential is missing from the project, while simultaneously not having the issue of git constantly telling me that config_dev.yml has new changes (and running the risk of someone committing those changes).

Right now, I have config_dev.yml doing

imports:
    - { resource: config_local.yml }

which is great, unless the file doesn't exist (i.e. for a new clone of the repository).

My question is: Is there any way to make this include optional? I.e., If the file exists then import it, otherwise ignore it.

Edit: I was hoping for a syntax like:

imports:
    - { resource: config.yml }
    ? { resource: config_local.yml }


I know this is a really old question, and I do think the approved solution is better I thought I would give a simpler solution which has the benefit of not changing any code

You can use the ignore_errors option, which won't display any errors if the file doesn't exist

imports:
   - { resource: config_local.yml, ignore_errors: true }

Warning, if you DO have a syntax error in the file, it will also be ignored, so if you have unexpected results, check to make sure there is no syntax error or other error in the file.


There is another option.

on app/appKernel.php change the registerContainerConfiguration method to this :

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

    $extrafiles = array (
        __DIR__.'/config/config_local.yml',
    );

    foreach ($extrafiles as $filename) {
        if (file_exists($filename) && is_readable($filename)) {
             $loader->load($filename);
        }
    }
}

this way you have a global config_local.yml file that overwrites the config_env.yml files


A solution is to create a separate environment, which is explained in the Symfony2 cookbook. If you do not wish to create one, there is another way involving the creation of an extension.

// src/Acme/Bundle/AcmeDemo/DepencendyInjection/AcmeDemoExtension.php
namespace Acme\DemoBundle\DependencyInjection;

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

class AcmeDemoExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {   
        // All following files will be loaded from the configuration directory
        // of your bundle. You may change the location to /app/ of course.
        $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));

        try
        {
            $loader->load('config_local.yml');
        }
        catch(\InvalidArgumentException $e)
        {
            // File was not found
        }
    }
}

Some digging in the Symfony code revealed me that YamlFileLoader::load() FileLocator::locate() will throw \InvalidArgumentException, if a file is not found. It is invoked by YamlFileLoader::load().

If you use the naming conventions, the extension will be automatically executed. For a more thorough explanation, visit this blog.


I tried both above answers but none did work for me.

  1. i made a new environment: "local" that imports "dev", but as you can read here: There is no extension able to load the configuration for "web_profiler" you also had to hack the AppKernel class.
    Further you couldnt set config_local.yml to .gitignore because the file is necessary in local env.

  2. Since i had to hack the AppKernel anyway i tried the approach with the $extrafiles but that resulted in "ForbiddenOverwriteException"

So now what worked for me was a modification of the $extrafiles approach:
replace in app/AppKernel.php
$loader->load(__DIR__ . '/config/config_' . $this->getEnvironment() . '.yml');
with

if ($this->getEnvironment() == 'dev') {
        $extrafiles = array(
            __DIR__ . '/config/config_local.yml',
        );
        foreach ($extrafiles as $filename) {
            if (file_exists($filename) && is_readable($filename)) {
                $loader->load($filename);
            }
        }
    } else {
        $loader->load(__DIR__ . '/config/config_' . $this->getEnvironment() . '.yml');
    }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜