symfony command -- Создать консольную команду php bin/console ...
Primary tabs
Симфони обладает мощным интрументом работы с приложением - с помощью консольных команд. Например:
php bin/console cache:clear
Рассмотрим создание своей собственной консольной команды на примере заполнения данными о продуктах интернет-магазина. (Инстанцирование Продукта и создание требуемых связей)
- Для начала создаём директорию src/AppBundle/Command и в ней класс CreateProductCommand.php:
<?php namespace AppBundle\Command; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; class CreateUserCommand extends Command { protected function configure() { ... } protected function execute(InputInterface $input, OutputInterface $output) { ... } } - Настраиваем конфигурации команды:
protected function configure() { $this // the name of the command (the part after "bin/console") ->setName('app:create-product') // the short description shown while running "php bin/console list" ->setDescription('Creates a new product.') // the full command description shown when running the command with // the "--help" option ->setHelp('This command allows you to create a product...') ; }Теперь мы можем запустить команду в консоли так:
php bin/console app:create-product
Результата пока не будет, т.к. не описана логика в методе execute()
- Метод execute() принимает 2 параметра.
$output - реализует методы OutputInterface(), например, может выводить на экран комментарии по ходу выполнения команды, текст запросов для ввода данных и некоторое другое.protected function execute(InputInterface $input, OutputInterface $output) { // метод writeln() отображает строки и добавляет /n в конце каждой $output->writeln([ 'Создание продукта...', '============', '', ]); // Здесь будет код создания продукта .. // метод write() отображает строки без переносов $output->write('Создано! '); } - Можно добавить параметры, вводимые после консольной команды. Добавляем в метод configure():
->addArgument('productName', InputArgument::REQUIRED)и теперь можем использовать введённый пользователем текст в execute():
$productName = $input->getArgument('productName'); if ($productName) { $data ['productName'] = $productName; }Параметр (или все параметры, в порядке объявления) пользователь должен ввести сразу после команды в консоли (можно сделать параметр необязательным, выставив флаг InputArgument::OPTIONAL):
php bin/console app:create-product my_product_name
В документации Symfony можно найти и другие возможности работы консольных команд.
- Далее просто дописываем всю логику того, что должна делать команда в метод execute().
- Если вам потребуется запускать консольную команду в коде(не из консоли), например, при запуске приложения, воспользуйтесь компонентом symfony, Console Component
ИТАК
У меня в целом получилось так:
<?php
namespace AppBundle\Command;
use AppBundle\Entity\Product;
use DateTime;
use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
class CreateProductCommand extends ContainerAwareCommand
{
protected function configure()
{
$this
->setName('app:create-product')
->setDescription('Создаём новый Product.')
->setHelp('Эта команда генерирует объект Product, а также все связанные с ним объекты.'
. 'Данные, заполняющие поля, необходимо ввести вручную в методе'
. 'CreateProductCommand::execute() в массив $data перед запуском команды')
->addArgument('productName', InputArgument::OPTIONAL)
;
}
protected function execute(InputInterface $input, OutputInterface $output)
{
$output->writeln([
'Создание Продукта...',
'============',
'',
]);
// Далее логика (то, что должна по сути делать ваша команда)
// Например, создаём продукт и записываем его в БД...
// ...
// проверяем, если был установлен необязательный атрибут при запуске консольной команды, заменяем имя на указанное пользователем значение
if ($input->getArgument('productName')) {
$productName = $input->getArgument('productName');
}
// ...
$output->writeln($input->getArgument('productName') . ' cоздан!');
}Источники
- Log in to post comments
- 5844 reads