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
- 5513 reads