ホームページ  >  記事  >  バックエンド開発  >  Symfony コンソールを使用した対話型デバッグ

Symfony コンソールを使用した対話型デバッグ

WBOY
WBOYオリジナル
2024-07-20 22:46:011096ブラウズ

Interactive debugging with Symfony Console

RoundingWell が持つ最も重要なシステムの 1 つは、評価エンジン (一般的に「評価」と呼ばれます) です。このシステムは、顧客固有に構成されたイベント リスナーの処理を担当し、各組織に非常にユニークなユーザー エクスペリエンスを提供できるようにします。言うまでもなく、このシステムはアプリケーションにとって非常に重要であり、特定のイベントに対してシステムが何を行ったか、またはこれから行う予定を正確に知ることができることが重要です。

今日、私は顧客の 1 人を従来のイベントから新しいイベントに移行する作業をしていて、いずれかのステップでイベントが正しく処理されていることを確認する必要がありました。私たちは評価に関して多くのログを記録しており、必要な情報がログにあることはわかっていました。しかし、ログが大量にある場合の問題は、ログが大量に存在することです。さらに、各トリガーの最初の部分を実行するだけで、移行が機能することを確認できました。

私はこう思いました。「評価エンジンに Xdebug のようなステップ デバッガーを使えたら賢明ではないでしょうか? Symfony Console にはこれに必要な機能がすべて揃っていることはわかっています...」

そして、まさにそれが私がしたことです。私たちのアプリケーションは完全に依存関係が注入されているため、構成を読み取り、評価を構成する「ステップ」を作成する役割を担う StepFactory をラップする新しいクラスを作成できました。

use RoundingWell\Framework\DebugVar;
use RuntimeException;
use Symfony\Component\Console\Style\SymfonyStyle;

readonly class StepFactoryWithConsoleConfirmation implements StepFactory
{
    public function __construct(
        private StepFactory $stepFactory,
        private SymfonyStyle $style,
        private bool $confirmCreatedStep = true,
        private bool $showCreatedStep = true,
        private bool $showStepDefinition = false,
    ) {
    }

    public function create(object $subject, StepDefinition $definition): Step
    {
        if ($this->showStepDefinition) {
            $debug = new DebugVar($definition->parameters);

            $this->style->info(
                message: <<<TEXT
                Next step is $definition->name with parameters:

                $debug
                TEXT,
            );
        }

        $step = $this->stepFactory->create($subject, $definition);

        if ($this->showCreatedStep) {
            $debug = new DebugVar($step);

            $this->style->info(
                message: <<<TEXT
                Step $definition->name created as:

                $debug
                TEXT,
            );
        }

        if ($this->confirmCreatedStep && ! $this->style->confirm(question: "Continue with evaluation?")) {
            throw new RuntimeException(
                message: "Evaluation aborted at step {$definition->name}",
            );
        }

        return $step;
    }
}

そして、コンソール コマンドでコンテナを少し操作することで、対話型の評価デバッガーが完成します。

use DI\Container;
use RoundingWell\Common\Command\CommandBus;
use RoundingWell\Common\Command\CommandBusComposed;
use RoundingWell\Common\Command\Middleware\LoggingMiddleware;
use RoundingWell\Evaluation\Command\EvaluateEvent;
use RoundingWell\Evaluation\Command\EvaluateEventHandler;
use RoundingWell\Evaluation\Step\StepFactory;
use RoundingWell\Evaluation\Step\StepFactoryWithConsoleConfirmation;
use Symfony\Component\Console\Style\SymfonyStyle;

readonly class EvaluationDebug
{
    public function __construct(
        private Container $container,
    ) {
    }

    public function __invoke(
        SymfonyStyle $symfonyStyle,
        string $eventType,
        string $eventId,
        string|null $evaluationId = null,
    ): void {
        // The command bus MUST ONLY log executed commands.
        $commandBus = new CommandBusComposed(
            $this->container->get(LoggingMiddleware::class),
        );

        // The step factory MUST be wrapped to step through the evaluation.
        $stepFactory = new StepFactoryWithConsoleConfirmation(
            stepFactory: $this->container->get(StepFactory::class),
            style: $symfonyStyle,
        );

        $this->container->set(CommandBus::class, $commandBus);
        $this->container->set(StepFactory::class, $stepFactory);

        $command = new EvaluateEvent(
            eventClass: $eventType,
            eventId: $eventId,
            evaluationId: $evaluationId,
        );

        $this->container->get(EvaluateEventHandler::class)->handle($command);

        $symfonyStyle->success('Evaluation complete');
    }
}

今日はここまでです!

以上がSymfony コンソールを使用した対話型デバッグの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。