Як викликати команду з контролера

Дата оновлення перекладу 2023-08-25

Як викликати команду з контролера

Документація компонента Console описує те, як створювати консольну команду. Ця стаття розкаже про те, як використовувати її прямо з вашого контролера.

Вам може знадобитися виконати деяку функцію, яка доступна лише у консольній команді. Зазвичай, вам потрібно було б перепроектувати команду та перемістити деяку логіку у сервіс, який можна використовуватиу контролері повторно. Однак, коли команда є частиною сторонньої бібліотеки, ви не хочете змінювати або дублювати її код. Замість цього, ви можете виконати команду напряму з контролера.

Caution

У порівнянні з прямим викликом з консолі, виклик команди з контролера має незначний вплив на продуктивність через витрати стеку запитів.

Уявіть, що ви хочете запустити debug:twig зсередини свого контролера:

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
33
34
35
36
37
38
// src/Controller/DebugTwigController.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 DebugTwigController extends AbstractController
{
    public function debugTwig(KernelInterface $kernel): Response
    {
        $application = new Application($kernel);
        $application->setAutoExit(false);

        $input = new ArrayInput([
            'command' => 'debug:twig',
            // (опціонально) визначіть значення аргументів команди
            'fooArgument' => 'barValue',
            // (опціонально) передайте опції команді
            '--bar' => 'fooValue',
            // (опціонально) передайте опції без значення
            '--baz' => true,
        ]);

        // Ви можете використати 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

Тепер, використайте його у своєму контролері:

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/Controller/DebugTwigController.php
namespace App\Controller;

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

class DebugTwigController extends AbstractController
{
    public function sendSpool(int $messages = 10): Response
    {
        // ...
        $output = new BufferedOutput(
            OutputInterface::VERBOSITY_NORMAL,
            true // true для декорованого
        );
        // ...

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

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

AnsiToHtmlConverter може бути також зареєстрований як розширення Twig, і підтримувати необовʼязкові теми.