addOption( 'include-system-extensions', null, InputOption::VALUE_NONE, 'Include template files that belong to TYPO3 system extensions', ); $this->addOption( 'stdin', null, InputOption::VALUE_NONE, 'Analyze template string that is provided via STDIN', ); $this->addOption( 'json', null, InputOption::VALUE_NONE, 'Output results as JSON', ); } protected function execute(InputInterface $input, OutputInterface $output): int { $templates = $input->getOption('stdin') ? ['php://stdin'] : $this->templateFinder->findTemplatesInAllPackages($input->getOption('include-system-extensions')); if ($input->getOption('json')) { $result = $this->validateTemplateFiles($templates); $result = $input->getOption('stdin') ? $result['php://stdin'] : $result; $output->writeln(json_encode($result)); return Command::SUCCESS; } $formatter = new FormatterHelper(); $io = new SymfonyStyle($input, $output); $io->note('This command only analyzes templates that are using the *.fluid.* file extension.'); $templatesCount = count($templates); if ($output->isVeryVerbose()) { $io->success(sprintf('%d templates will be analyzed:', $templatesCount)); $index = 0; foreach ($templates as $template) { $index++; $output->writeln(sprintf('%d %s', $index, $template)); } } $results = $this->validateTemplateFiles($templates); $errors = $deprecations = 0; foreach ($results as $result) { $templateFile = $result->path; if (str_starts_with($templateFile, Environment::getProjectPath())) { $templateFile = substr($templateFile, strlen(Environment::getProjectPath()) + 1); } foreach ($result->errors as $error) { $errors++; $output->writeln($formatter->formatSection( 'ERROR', $templateFile . ': ' . $error->getMessage(), 'error', )); } foreach ($result->deprecations as $deprecation) { $deprecations++; $output->writeln($formatter->formatSection( 'DEPRECATION', $templateFile . ': ' . $deprecation->message, 'info', )); } } if ($output->isVerbose()) { if ($errors > 0) { $output->writeln(''); $io->error(sprintf('%d error(s) found in %d analyzed templates.', $errors, $templatesCount)); } if ($deprecations > 0) { $output->writeln(''); $io->warning(sprintf('%d deprecation(s) found in %d analyzed templates.', $deprecations, $templatesCount)); } if ($errors === 0 && $deprecations === 0) { $io->success(sprintf('%d templates analyzed without errors or deprecations.', $templatesCount)); } } return $errors > 0 ? Command::FAILURE : Command::SUCCESS; } /** * @return TemplateValidatorResult[] */ private function validateTemplateFiles(array $templates): array { return (new TemplateValidator())->validateTemplateFiles( $templates, $this->renderingContextFactory->create(), ); } }