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 サイトの他の関連記事を参照してください。