Как в Symfony вызывать консольные команды из Контроллера?

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

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

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

По сравнению с прямым вызовом из консоли, вызов команды из контроллера имеет небольшое влияние на производительность из-за дополнительных накладных расходов на ресурсы.

Представьте, что вы хотите отправлять отложенные сообщения Swift Mailer с помощью команды swiftmailer:spool:send. Запустите эту команду из вашего контроллера, следующим образом:

<?php

// src/Controller/SpoolController.php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\KernelInterface;

class SpoolController extends AbstractController
{
    public function sendSpool($messages = 10, KernelInterface $kernel)
    {
        $application = new Application($kernel);
        $application->setAutoExit(false);

        $input = new ArrayInput([
           'command' => 'swiftmailer:spool:send',
           // (опционально) определение значений аргументов команды
           'fooArgument' => 'barValue',
           // (опционально) передача параметров в консольную команду
           '--message-limit' =; $messages,
        ]);

        // Вы можете использовать NullOutput() если не желаете выводить данные из команды
        $output = new BufferedOutput();
        $application->run($input, $output);

        // возвращаете вывод из команды, не используйте, если вы использовали NullOutput()
        $content = $output->fetch();

        // укажите return new Response(""), если ранее вы использовали пустой вывод NullOutput()
        return new Response($content);
    }
}

Добавить комментарий

Ваш адрес email не будет опубликован.