>  기사  >  백엔드 개발  >  Symfony 콘솔을 사용한 대화형 디버깅

Symfony 콘솔을 사용한 대화형 디버깅

WBOY
WBOY원래의
2024-07-20 22:46:011096검색

Interactive debugging with Symfony Console

RoundingWell에서 보유한 가장 중요한 시스템 중 하나는 평가 엔진, 즉 일반적으로 "평가"라고 부르는 것입니다. 이 시스템은 고객별로 구성된 이벤트 리스너를 처리하는 역할을 하며 이를 통해 각 조직에 매우 고유한 사용자 경험을 제공할 수 있습니다. 말할 필요도 없이 이 시스템은 우리 애플리케이션에 매우 중요하며 주어진 이벤트에 대해 시스템이 무슨 일을 했는지, 할 것인지

정확히 알 수 있는 능력은 매우 중요합니다.

오늘 저는 고객 중 한 명을 기존 이벤트에서 최신 이벤트로 전환하는 작업을 하고 있었고 단계 중 하나가 이벤트를 올바르게 처리하고 있는지 확인해야 했습니다. 우리는 평가와 관련하여 많은 로그를 기록하고 있으며 필요한 정보가 로그에 있다는 것을 알았습니다. 하지만 로깅이 많을 때의 문제는 로그가 많다는 것입니다. 또한 마이그레이션이 제대로 작동했는지 확인하기 위해 각 트리거의 첫 번째 부분만 실행하면 되었습니다.

저는 "평가 엔진을 위해 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.