symfony command -- Создать консольную команду php bin/console ...

Симфони обладает мощным интрументом работы с приложением - с помощью консольных команд. Например:

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оздан!');
    }

Источники

https://symfony.com/doc/current/console....