Как создать и выполнить пользовательскую консольную команду в Symfony 3

Платформа Symfony предоставляет множество команд через bin/console скрипт (например, хорошо известный кэш bin / console: команда clear). Эти команды создаются с помощью компонента Console.

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

Ваша первая команда

Чтобы понять необходимую структуру и то, как работает команда, мы собираемся реализовать вашу первую команду, которая в основном выведет некоторый текст в консоль. Команды определены в классах, которые должны быть созданы в пространстве имен команд вашего пакета (например, sandboxBundle\Command) и их имена должны заканчиваться Command суффикс.

Для начала найдите свой пакет, где вы хотите создать свою команду (в этом случае наш пакет будет sandboxBundle) и создайте на нем папку с именем Command, Внутри папки Command создайте новый класс с именем TestCommand.php.

Ваша структура пакета должна быть похожа на:

Папка команд с классом TestCommand

Наконец, добавьте следующий код в ранее созданный класс (не забудьте изменить пространство имен в соответствии с вашим собственным пакетом):

setName('app:test-command')
// the short description shown while running "php bin/console list"
->setDescription('Prints some text into the console.')
// the full command description shown when running the command with
// the "--help" option
->setHelp("This command allows you to print some text in the console")
;
}
protected function execute(InputInterface $input, OutputInterface $output)
{
// outputs multiple lines to the console (adding "\n" at the end of each line)
$output->writeln([
'My First Symfony command',// A line
'============',// Another line
'',// Empty line
]);
// outputs a message followed by a "\n"
$output->writeln('Hey welcome to the test command wizard.');
$output->writeln('Thanks for read the article');
// outputs a message without adding a "\n" at the end of the line
$output->write("You've succesfully implemented your first command");
}
}

Теперь наша команда готова к исполнению. Как определено в методе настройки, имя предыдущей команды будет app:test-command и может быть выполнен с использованием следующей строки в командной строке:

php bin/console app:test-command

И вывод в командной строке:

Вывод пользовательской консоли Symfony

Теперь дело не в том, что теперь, когда вы понимаете, как работает команда, вы готовы создавать более сложные команды.

Обработка и установка аргументов команды (ввод)

Иногда вам нужно предоставить некоторые параметры для ваших команд, таких как число, идентификаторы, текст и т. Д.

Чтобы разрешить использование аргументов в наших командах, нам нужно включить InputArgument класс в нашей команде, чтобы добавить аргументы, используйте addArgument метод в методе настройки.

setName('app:print-text')
// the short description shown while running "php bin/console list"
->setHelp("This command allows you to print some text in the console")
// the full command description shown when running the command with
->setDescription('Prints some text into the console with given parameters.')
// Arguments
->addArgument('text', InputArgument::REQUIRED, 'The text to print')
;
}
protected function execute(InputInterface $input, OutputInterface $output)
{
// outputs multiple lines to the console (adding "\n" at the end of each line)
$output->writeln([
'My Second Symfony command',// A line
'============',// Another line
'',// Empty line
]);
// Get providen text using the $input->getArgument method.
$text = $input->getArgument('text');
$output->writeln("Providen text : ".$text);
}
}

Теперь наша команда готова к исполнению. Как определено в методе configure, имя предыдущей команды будет app: print-text, и в качестве параметра он ожидает строку для печати. Это может быть выполнено с использованием следующей строки в командной строке:

php bin/console app:print-text "Hello world, my first argument"

И вывод в командной строке:

Symfony print аргумент

Обрабатывать и устанавливать параметры команды (входные параметры)

Иногда вам нужно предоставить некоторые параметры для ваших команд в виде чисел, идентификаторов и т. Д., Как любая существующая команда делает. По умолчанию команда может обрабатывать параметры, если они предварительно настроены в коде команды, в противном случае вы получите сообщения об ошибках, такие как Too many arguments или же the [option] does not exist,

Чтобы добавить параметры в вашу команду, нам нужно включить классы InputDefinition и InputOption, затем мы добавим параметры, используя метод setDefinition, и параметры в качестве первого параметра InputDefinition в массиве.

setName('app:print-lines')
// the short description shown while running "php bin/console list"
->setHelp("This command allows you to print some text in the console")
// the full command description shown when running the command with
->setDescription('Prints some text into the console with given parameters.')
// Set options
->setDefinition(
new InputDefinition(array(
new InputOption('firstline', 'a', InputOption::VALUE_REQUIRED,"The first line to be printed","Default First Line Value"),
new InputOption('secondline', 'b', InputOption::VALUE_OPTIONAL,"The second line to be printed","Default First Line Value"),
))
)
;
}
protected function execute(InputInterface $input, OutputInterface $output)
{
// outputs multiple lines to the console (adding "\n" at the end of each line)
$output->writeln([
'My Third Symfony command',// A line
'============',// Another line
'',// Empty line
]);
$firstLine = $input->getOption('firstline');
$secondline = $input->getOption('secondline');
$output->writeln("First line value : ".$firstLine);
if($secondline){
$output->writeln("Second line value : ".$secondline);
}
// Instead of retrieve line per line every option, you can get an array of all the providen options :
//$output->writeln(json_encode($input->getOptions()));
}
}

Замечания: ярлыки должны быть длиной не более 1 символа. Если вам нужно добавить только 1 параметр, вы можете использовать метод setOption в функции конфигурации.

Теперь наша команда готова к исполнению. Как определено в методе настройки, имя предыдущей команды будет app:print-lines и он ожидает в качестве параметра строку для печати. Это может быть выполнено с использованием следующей строки в командной строке:

php bin/console app:print-lines --firstline="Hello" --secondline="World"
#Or with the shortcuts
php bin/console app:print-lines -a "Hello" -b "World"

Доступ к услугам из контейнера

Возможно, ваши приставки предназначены не только для написания некоторого текста в консоли. Вы можете получить доступ ко всем службам из контейнера внутри команды, т.е. Doctrine, Translator и т. Д.

Вам просто нужно включить ContainerAwareCommand класс в вашу команду и вместо продления командования класс нужно продлить ContainerAwareCommand класс, и вы сможете получить доступ к контейнеру, как описано ниже, в противном случае вы найдете такие ошибки, как Attempted to call and undefined method named "getContainer" of class YourCommand,

В этом случае мы получим сервис Doctrine для получения менеджера сущностей и создадим несколько запросов к нашей базе данных:

setName('app:verify-doctrine')
// the short description shown while running "php bin/console list"
->setHelp("This command allows you to print some text in the console")
// the full command description shown when running the command with
->setDescription('Prints some text into the console with given parameters.')
;
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$output->writeln([
'My Final Symfony command',// A line
'============',// Another line
'',// Empty line
]);
$doctrine = $this->getContainer()->get('doctrine');
$em = $doctrine->getEntityManager();
// Now you can get repositories
// $usersRepo = $em->getRepository("myBundle:Users");
// $user = $usersRepo->find(1);
// outputs multiple lines to the console (adding "\n" at the end of each line)
$output->writeln("Doctrine worked, it didn't crashed :) ");
// Instead of retrieve line per line every option, you can get an array of all the providen options :
//$output->writeln(json_encode($input->getOptions()));
}
}

И вывод:

Учение Symfony 3 команда

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

Заключение

Может быть трудно понять, как аргументы обрабатываются консольным приложением, однако приложение Symfony Console, как и многие другие утилиты CLI, следует поведению, описанному в docopt стандарты.

Повеселись !

Ссылка на основную публикацию
Adblock
detector