How to Call a Command from a Controller

The Console component documentation covers how to create a console command. This article covers how to use a console command directly from your controller.

コンソール コンポーネントのドキュメントには、コンソール コマンドの作成方法が記載されています。この記事では、コントローラーから直接コンソール コマンドを使用する方法について説明します。

You may have the need to call some function that is only available in a console command. Usually, you should refactor the command and move some logic into a service that can be reused in the controller. However, when the command is part of a third-party library, you don't want to modify or duplicate their code. Instead, you can run the command directly from the controller.

コンソール コマンドでのみ使用できる関数を呼び出す必要がある場合があります。通常、コマンドをリファクタリングし、一部のロジックをコントローラーで再利用できるサービスに移動する必要があります。ただし、コマンドがサードパーティ ライブラリの一部である場合、そのコードを変更または複製したくはありません。代わりに、コントローラから直接コマンドを実行できます。

Caution

注意

In comparison with a direct call from the console, calling a command from a controller has a slight performance impact because of the request stack overhead.

コンソールからの直接呼び出しと比較して、コントローラーからコマンドを呼び出すと、要求のスタック オーバーヘッドのため、パフォーマンスにわずかな影響があります。

Imagine you want to run the debug:twig from inside your controller:

コントローラー内から 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
// 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',
            // (optional) define the value of command arguments
            'fooArgument' => 'barValue',
            // (optional) pass options to the command
            '--bar' => 'fooValue',
        ]);

        // You can use NullOutput() if you don't need the output
        $output = new BufferedOutput();
        $application->run($input, $output);

        // return the output, don't use if you used NullOutput()
        $content = $output->fetch();

        // return new Response(""), if you used NullOutput()
        return new Response($content);
    }
}

Showing Colorized Command Output

By telling the BufferedOutput it is decorated via the second parameter, it will return the Ansi color-coded content. The SensioLabs AnsiToHtml converter can be used to convert this to colorful HTML.

BufferedOutput が 2 番目のパラメーターで装飾されていることを伝えると、Ansi の色分けされたコンテンツが返されます。 SensioLabs AnsiToHtml コンバーターを使用して、これをカラフルな HTML に変換できます。

First, require the package:

まず、パッケージを要求します。
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/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 for decorated
        );
        // ...

        // return the output
        $converter = new AnsiToHtmlConverter();
        $content = $output->fetch();

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

The AnsiToHtmlConverter can also be registered as a Twig Extension, and supports optional themes.

AnsiToHtmlConverter は Twig 拡張機能として登録することもでき、オプションのテーマをサポートします。