N°6934 - Symfony 6.4 - upgrade Symfony bundles to 6.4 (#580)

* Update Symfony lib to version ~6.4.0
* Update code missing return type
* Add an iTop general configuration entry to store application secret (Symfony mandatory parameter)
* Use dependency injection in ExceptionListener & UserProvider classes
This commit is contained in:
bdalsass
2023-12-05 13:56:56 +01:00
committed by GitHub
parent 863ab4560c
commit 27ce51ab07
1392 changed files with 44869 additions and 27799 deletions

View File

@@ -11,6 +11,7 @@
namespace Symfony\Bridge\Twig\Command;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Completion\CompletionInput;
use Symfony\Component\Console\Completion\CompletionSuggestions;
@@ -21,8 +22,8 @@ use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\ErrorHandler\ErrorRenderer\FileLinkFormatter;
use Symfony\Component\Finder\Finder;
use Symfony\Component\HttpKernel\Debug\FileLinkFormatter;
use Twig\Environment;
use Twig\Loader\ChainLoader;
use Twig\Loader\FilesystemLoader;
@@ -32,17 +33,20 @@ use Twig\Loader\FilesystemLoader;
*
* @author Jordi Boggiano <j.boggiano@seld.be>
*/
#[AsCommand(name: 'debug:twig', description: 'Show a list of twig functions, filters, globals and tests')]
class DebugCommand extends Command
{
protected static $defaultName = 'debug:twig';
protected static $defaultDescription = 'Show a list of twig functions, filters, globals and tests';
private Environment $twig;
private ?string $projectDir;
private array $bundlesMetadata;
private ?string $twigDefaultPath;
private $twig;
private $projectDir;
private $bundlesMetadata;
private $twigDefaultPath;
private $filesystemLoaders;
private $fileLinkFormatter;
/**
* @var FilesystemLoader[]
*/
private array $filesystemLoaders;
private ?FileLinkFormatter $fileLinkFormatter;
public function __construct(Environment $twig, string $projectDir = null, array $bundlesMetadata = [], string $twigDefaultPath = null, FileLinkFormatter $fileLinkFormatter = null)
{
@@ -55,15 +59,17 @@ class DebugCommand extends Command
$this->fileLinkFormatter = $fileLinkFormatter;
}
/**
* @return void
*/
protected function configure()
{
$this
->setDefinition([
new InputArgument('name', InputArgument::OPTIONAL, 'The template name'),
new InputOption('filter', null, InputOption::VALUE_REQUIRED, 'Show details for all entries matching this filter'),
new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (text or json)', 'text'),
new InputOption('format', null, InputOption::VALUE_REQUIRED, sprintf('The output format ("%s")', implode('", "', $this->getAvailableFormatOptions())), 'text'),
])
->setDescription(self::$defaultDescription)
->setHelp(<<<'EOF'
The <info>%command.name%</info> command outputs a list of twig functions,
filters, globals and tests.
@@ -88,7 +94,7 @@ EOF
;
}
protected function execute(InputInterface $input, OutputInterface $output)
protected function execute(InputInterface $input, OutputInterface $output): int
{
$io = new SymfonyStyle($input, $output);
$name = $input->getArgument('name');
@@ -98,16 +104,11 @@ EOF
throw new InvalidArgumentException(sprintf('Argument "name" not supported, it requires the Twig loader "%s".', FilesystemLoader::class));
}
switch ($input->getOption('format')) {
case 'text':
$name ? $this->displayPathsText($io, $name) : $this->displayGeneralText($io, $filter);
break;
case 'json':
$name ? $this->displayPathsJson($io, $name) : $this->displayGeneralJson($io, $filter);
break;
default:
throw new InvalidArgumentException(sprintf('The format "%s" is not supported.', $input->getOption('format')));
}
match ($input->getOption('format')) {
'text' => $name ? $this->displayPathsText($io, $name) : $this->displayGeneralText($io, $filter),
'json' => $name ? $this->displayPathsJson($io, $name) : $this->displayGeneralJson($io, $filter),
default => throw new InvalidArgumentException(sprintf('Supported formats are "%s".', implode('", "', $this->getAvailableFormatOptions()))),
};
return 0;
}
@@ -119,11 +120,11 @@ EOF
}
if ($input->mustSuggestOptionValuesFor('format')) {
$suggestions->suggestValues(['text', 'json']);
$suggestions->suggestValues($this->getAvailableFormatOptions());
}
}
private function displayPathsText(SymfonyStyle $io, string $name)
private function displayPathsText(SymfonyStyle $io, string $name): void
{
$file = new \ArrayIterator($this->findTemplateFiles($name));
$paths = $this->getLoaderPaths($name);
@@ -164,9 +165,7 @@ EOF
[$namespace, $shortname] = $this->parseTemplateName($name);
$alternatives = $this->findAlternatives($shortname, $shortnames);
if (FilesystemLoader::MAIN_NAMESPACE !== $namespace) {
$alternatives = array_map(function ($shortname) use ($namespace) {
return '@'.$namespace.'/'.$shortname;
}, $alternatives);
$alternatives = array_map(fn ($shortname) => '@'.$namespace.'/'.$shortname, $alternatives);
}
}
@@ -200,7 +199,7 @@ EOF
}
}
private function displayPathsJson(SymfonyStyle $io, string $name)
private function displayPathsJson(SymfonyStyle $io, string $name): void
{
$files = $this->findTemplateFiles($name);
$paths = $this->getLoaderPaths($name);
@@ -218,7 +217,7 @@ EOF
$io->writeln(json_encode($data));
}
private function displayGeneralText(SymfonyStyle $io, string $filter = null)
private function displayGeneralText(SymfonyStyle $io, string $filter = null): void
{
$decorated = $io->isDecorated();
$types = ['functions', 'filters', 'tests', 'globals'];
@@ -252,7 +251,7 @@ EOF
}
}
private function displayGeneralJson(SymfonyStyle $io, ?string $filter)
private function displayGeneralJson(SymfonyStyle $io, ?string $filter): void
{
$decorated = $io->isDecorated();
$types = ['functions', 'filters', 'tests', 'globals'];
@@ -291,7 +290,7 @@ EOF
}
foreach ($namespaces as $namespace) {
$paths = array_map([$this, 'getRelativePath'], $loader->getPaths($namespace));
$paths = array_map($this->getRelativePath(...), $loader->getPaths($namespace));
if (FilesystemLoader::MAIN_NAMESPACE === $namespace) {
$namespace = '(None)';
@@ -306,7 +305,7 @@ EOF
return $loaderPaths;
}
private function getMetadata(string $type, $entity)
private function getMetadata(string $type, mixed $entity): mixed
{
if ('globals' === $type) {
return $entity;
@@ -364,7 +363,7 @@ EOF
return null;
}
private function getPrettyMetadata(string $type, $entity, bool $decorated): ?string
private function getPrettyMetadata(string $type, mixed $entity, bool $decorated): ?string
{
if ('tests' === $type) {
return '';
@@ -381,7 +380,7 @@ EOF
if ('globals' === $type) {
if (\is_object($meta)) {
return ' = object('.\get_class($meta).')';
return ' = object('.$meta::class.')';
}
$description = substr(@json_encode($meta), 0, 50);
@@ -545,7 +544,7 @@ EOF
}
$threshold = 1e3;
$alternatives = array_filter($alternatives, function ($lev) use ($threshold) { return $lev < 2 * $threshold; });
$alternatives = array_filter($alternatives, fn ($lev) => $lev < 2 * $threshold);
ksort($alternatives, \SORT_NATURAL | \SORT_FLAG_CASE);
return array_keys($alternatives);
@@ -570,7 +569,7 @@ EOF
*/
private function getFilesystemLoaders(): array
{
if (null !== $this->filesystemLoaders) {
if (isset($this->filesystemLoaders)) {
return $this->filesystemLoaders;
}
$this->filesystemLoaders = [];
@@ -597,4 +596,9 @@ EOF
return (string) $this->fileLinkFormatter->format($absolutePath, 1);
}
private function getAvailableFormatOptions(): array
{
return ['text', 'json'];
}
}