Могу ли я включить дополнительный файл конфигурации в Symfony2? - PullRequest
15 голосов
/ 07 сентября 2011

Я хочу создать локальный конфигурационный файл config_local.yml, который позволяет правильно настраивать каждую среду разработки, не портя среды разработки других людей. Я хочу, чтобы это был отдельный файл, чтобы я мог "gitignore" его и знать, что ничего существенного не пропущено в проекте, и в то же время не имея проблемы с git, постоянно сообщая мне, что config_dev.yml имеет новые изменения (и рискуя кто-то совершает эти изменения).

Прямо сейчас я выполняю config_dev.yml

imports:
    - { resource: config_local.yml }

, что замечательно, если файл не существует (то есть для нового клона репозитория).

Мой вопрос: есть ли способ сделать это включенным по желанию? Т.е., если файл существует, то импортируйте его, иначе проигнорируйте его.

Редактировать: Я надеялся на такой синтаксис, как:

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

Ответы [ 4 ]

23 голосов
/ 07 ноября 2013

Я знаю, что это действительно старый вопрос, и я думаю, что одобренное решение лучше, я думал, что дам более простое решение, которое имеет преимущество в том, что не меняет код

Вы можете использовать опцию ignore_errors, которая не будет отображать никаких ошибок, если файл не существует

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

Предупреждение , если у вас действительно есть синтаксическая ошибка в файле, она также будет игнорироваться, поэтому, если у вас есть непредвиденные результаты, убедитесь, что в файле нет синтаксической ошибки или другой ошибки .

16 голосов
/ 05 октября 2011

Есть еще один вариант.

в app / appKernel.php измените метод registerContainerConfiguration на этот:

 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);
        }
    }
}

таким образом, у вас есть глобальный файл config_local.yml, который перезаписывает файлы config_env.yml

8 голосов
/ 07 сентября 2011

Решение состоит в том, чтобы создать отдельную среду, которая описана в поваренной книге Symfony2 .Если вы не хотите создавать его, существует другой способ создания расширения.

// 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
        }
    }
}

Некоторые поиски в коде Symfony показали, что YamlFileLoader::load() FileLocator::locate()выдаст \InvalidArgumentException, если файл не найден.Он вызывается YamlFileLoader::load().

Если вы используете соглашения об именах, расширение будет выполнено автоматически.Для более подробного объяснения, посетите этот блог .

1 голос
/ 26 апреля 2012

Я пробовал оба вышеуказанных ответа, но ни один не помог мне.

  1. я создал новую среду: "local", которая импортирует "dev", но, как вы можете прочитать здесь: Нет расширения, способного загрузить конфигурацию для "web_profiler" вам также пришлось взломать класс AppKernel.
    Кроме того, вы не можете установить config_local.yml в .gitignore, потому что файл необходим в локальной среде.

  2. Так как мне пришлосьвзломать AppKernel в любом случае, я попробовал подход с $ extrafiles, но это привело к «ForbiddenOverwriteException»

Так что теперь для меня сработало изменение подхода $ extrafiles:
replaceв app / AppKernel.php
$loader->load(__DIR__ . '/config/config_' . $this->getEnvironment() . '.yml');
с

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');
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...