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

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

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

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

Caution

В сравнении с прямым вызовом из консоли, вызов команды из контроллера имеет незначительное влияние на производительность из-за издержек стека запроса.

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// src/AppBundle/Controller/SpoolController.php
namespace AppBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
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 Controller
{
    public function sendSpoolAction($messages = 10, KernelInterface $kernel)
    {
        $application = new Application($kernel);
        $application->setAutoExit(false);

        $input = new ArrayInput(array(
           'command' => 'swiftmailer:spool:send',
           '--message-limit' => $messages,
        ));
        // Вы можете использовать NullOutput(), если вам не нужен вывод
        $output = new BufferedOutput();
        $application->run($input, $output);

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

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

Отображение цветного вывода команды

Если вы сообщите BufferedOutput, что он декорирован через второй параметр, то он вернёт Ansi содержимое с цветной маркировкой. Чтобы конвертировать это в цветной HTML, может быть использован Преобразователь SensioLabs AnsiToHtml.

Вначале, запросите пакет:

1
$ composer require sensiolabs/ansi-to-html

Now, use it in your controller:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// src/AppBundle/Controller/SpoolController.php
namespace AppBundle\Controller;

use SensioLabs\AnsiConverter\AnsiToHtmlConverter;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\HttpFoundation\Response;
// ...

class SpoolController extends Controller
{
    public function sendSpoolAction($messages = 10)
    {
        // ...
        $output = new BufferedOutput(
            OutputInterface::VERBOSITY_NORMAL,
            true // true for decorated
        );
        // ...

        // вернуть вывод
        $converter = new AnsiToHtmlConverter();
        $content = $output->fetch();

        return new Response($converter->convert($content));
    }
}

AnsiToHtmlConverter может быть также зарегистрирован, как расширение Twig, и поддерживать необязательные темы.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.