Symfony — задача — работа с опциями

Где-нибудь написано (руководство или документация), как правильно работать с параметрами в пользовательской задаче symfony?

class mloMaintainceTask extends sfBaseTask
{
  protected function configure()
  {
    // ...
    $this->setOptions(array(
      new sfCommandOption('mloOption');
    ));
  }

  private function method3()
  {
    return $this->getOption('mloOption');
  }
}

Есть ли что-то вроде метода getOption из примера method3


person Mailo Světel    schedule 03.09.2009    source источник


Ответы (2)


На всякий случай, если вы еще не видели это: http://www.symfony-project.org/cookbook/1_1/en/tasks

Это дает хороший обзор создания пользовательских задач, включая параметры и аргументы. На самом деле я только что сел написать пару задач несколько дней назад, поэтому я попытаюсь пройтись по тому, что я уже понял. Вот пример созданной мной задачи, которая обновляет проект из subversion для быстрой перестройки:

$this->addOptions(array(
    new sfCommandOption('username', null, sfCommandOption::PARAMETER_REQUIRED, 'Subversion username'),
    ...
));

Первый параметр — это имя параметра, и он будет играть роль в выполнении команды:

./symfony my:task --имя пользователя="foo"

Второй параметр определен как ярлык в определении класса (%symfony_lib_dir%/command/sfCommandOption.class.php), но я еще не играл с ним, ваше предположение так же хорошо, как и мое.

Третий параметр указывает, есть ли в аргументе что-то большее, чем просто вызов. Ваши варианты следующие:

PARAMETER_NONE
  ex: --username
PARAMETER_OPTIONAL
  ex: --username[=...]
PARAMETER_REQUIRED
  ex: --username=...

Четвертый параметр — это описание аргумента для вывода справки.

Существует необязательный пятый параметр, который можно указать в качестве значения по умолчанию, если вы не PARAMETER_NONE (если это так, он вызовет исключение при выполнении).

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

protected function execute($arguments = array(), $options = array()) {
    $task = 'svn up';
    if($options['username']) {
        $task .= ' --username="' . $options['username'] . '"';
    }
    ....
}

Что всегда было для меня самым полезным, так это примеры кода, и, поскольку Symfony поставляется с большой коллекцией существующих задач, я настоятельно рекомендую просмотреть их (%symfony_lib_dir%/task/*) для вдохновения и руководства. Мне очень помог проект /sfProjectDeploy.class.php, в частности, он использует широкий спектр функций sfTask и был крайне важен для поиска пути в моих пользовательских задачах.

Надеюсь, это поможет.

person nortron    schedule 05.09.2009
comment
Когда я создаю экземпляр объекта формы, я могу передать параметры конструктору, а затем получить к нему доступ в классе формы с помощью $this->getOption('nameOfPassedVariable'). В задачах нет ничего похожего? - person Mailo Světel; 11.09.2009
comment
Не как функция, нет. Вместо этого вы можете просто использовать ассоциативный массив во втором параметре функции выполнения таким же образом ($options['option_name']). На самом деле нет необходимости в функции, поскольку набор доступных вам опций и параметров ограничен тем, что было настроено в вашем методе настройки. - person nortron; 13.09.2009

Вы должны явно передавать значения реальных опций другим методам.

private function method3($optionvalue)
{
  return $optionvalue;
}
protected function execute($arguments = array(), $options = array())
{
  /*blablabla*/
  echo $this->method3($options['mlooption']);
  /*blablabla*/
}
person Andrei Dziahel    schedule 04.09.2009
comment
Я встречал $options, но никогда нет тех вариантов, которые я дал к задаче - person Mailo Světel; 05.09.2009