Symfony 4 - Можно ли сделать переменную имя команды? - PullRequest
0 голосов
/ 07 июня 2019

Я делаю тестовое CLI-приложение с Symfony 4 и мне интересно, возможно ли создать один ClassCommand для нескольких целей?!

Например, мое тестовое клиентское приложение имеет несколько действий / команд, но они очень похожи. Я не люблю дублировать код (также DRY-рекомендации никто не отменял), поэтому я подумал, что было бы лучше иметь одну команду, но в зависимости от ее имени выбрать, какой алгоритм использовать. Например. имя команды user: manager выполнит один набор инструкций, а user: designer - другой, и все это в одной ClassCommand.

namespace App\Command;


use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class UserCommand extends Command
{

    // some properties

    protected function configure()
    {
        $this
            ->setName('user:somebody')
        // and other stuff
    }
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        // output code here
    }

}

Для других команд сейчас я должен создать еще одну ClassCommand. Хорошо, я могу расширить его из UserCommand, но мне все еще нужно указать методы "configure" и "execute" (если он должен быть переопределен). Слишком много лишнего кода, не так ли?

На данный момент я не знаю, как сделать то, что я хочу.

Возвращаясь к вопросу: возможно ли сделать имя команды динамическим?

1 Ответ

0 голосов
/ 07 июня 2019

Нет, это невозможно. Но я не думаю, что это будет правильным решением.

Я бы предложил один из следующих подходов; либо:

  • создать одну команду для набора команд (например, один класс команд для user:manager и один для user:designer). Затем вы используете черты или расширяете общий класс для выполнения работы.

  • или передать аргумент одному классу команд - например, bin/console user:do-thing --type=designer

Я могу расширить его из UserCommand, но мне все еще нужно указать методы "configure" и "execute" (если он должен быть переопределен). Слишком много лишнего кода, не так ли?

Вы можете указать оба этих метода в своей абстрактной UserCommand и объявить некоторые абстрактные методы, такие как getCommandName(), которые вы бы реализовали в своем классе конструктора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...