Як викликати команду з контролера
Дата оновлення перекладу 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,
і підтримувати необовʼязкові теми.