in Профессиональное

Сниппет: загружаем переменные app.yml из CLI task в symfony

В ходе обсуждения в русскоязычном чате пользователей symfony возник вопрос о загрузке конфигурационных констант из app.yml в контексте CLI таска. Как правило, с теми классами, которые работают из-под приложения (frontend, backend или что там у вас), проблем не возникает. Не зависимо от того на каком уровне расположен app.yml, к нему можно получить доступ стандартными средствами через sfConfig::get().

В тасках же конфигурация уровня приложения не инициализируется, поэтому sfConfig::get('app_some_param') будет возвращать NULL. Немного покопавшись в API родился такой сниппет-скелетон таска:

<?php
/**
 * @package
 * @subpackage task
 * @author     dmitry.bykadorov@gmail.com
 * @version    SVN: $Id:  $
 */
class TestTask extends sfBaseTask
{
  protected function configure()
  {
    $this->namespace = 'sf';
    $this->name = 'test';
    $this->briefDescription = 'TODO';

    $this->detailedDescription = <<<EOF
TODO
EOF;
  }

  protected function execute($arguments = array(), $options = array())
  {
    $configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'prod', true);
    var_dump( sfConfig::get( "app_some_param" ) );
  }
}

Протестировано на sf_root_dir/config/app.yml

Write a Comment

Comment

*

  1. При создании таска стандартной командой symfony generate:task и внимательном рассмотрении метода configure сгенерированного класса таска, можно обнаружить опцию application, которая как раз отвечает за то, что нужно. Можно прописать дефолтное значение вместо null и при этом можно пользоваться опциями командной строки ./symfony sandbox:mytask –application=frontend

    • Т.е. конфигурация тогда автоматически создается? Или что?

      • Да, именно так, автоматически подгрузятся все необходимые вам YAML, ранее доступные в app frontend.

          • За статью спасибо, как раз искал решение это проблемы.
            А что еще за способ который предложил Programmer? У меня не получается…

          • Указывать -–application=frontend, базовый CLI поддерживает это, даже если вы в своем таске его не указывали.