feat: migrer vers Symfony 8, PHP 8.4 et les dépendances majeures associées

- PHP 8.3 → 8.4 (Dockerfile + composer.json)
- Symfony 7.0 → 8.0 (tous les composants symfony/*)
- API Platform 3.x → 4.x : migration openapiContext → openapi: new Operation(...)
- Doctrine DBAL 3 → 4 : suppression use_savepoints, replace prepare/executeQuery
- Doctrine ORM 2.x → 3.x : ClassMetadataInfo → ClassMetadata, setParameters → setParameter
- Doctrine Bundle 2.x → 3.x, Fixtures Bundle 3.x → 4.x
- zenstruck/foundry 1.x → 2.x : ModelFactory → PersistentObjectFactory, getDefaults → defaults
- phpmd/phpmd 2.x → 3.x-dev (seule version supportant Symfony 8)
- phparkitect 0.3 → 0.8 : NotDependsOnTheseNamespaces prend un array
- symfony/mercure-bundle 0.3 → 0.4, symfony/monolog-bundle 3 → 4
- Suppression de runtime/frankenphp-symfony (intégré nativement dans symfony/runtime 8)
- worker.Caddyfile : suppression de APP_RUNTIME (détection automatique Symfony 8)
- Routes errors.xml/wdt.xml/profiler.xml → .php (Symfony 8 supprime le XML)
- Types::ARRAY → Types::JSON dans Entity/Manga.php (DBAL 4 retire array type)
- Suppression de src/Schedule.php (doublon vide avec MonitoringSchedule)
- Tests : hydra:Collection → Collection, hydra:member → member (API Platform 4)
This commit is contained in:
ext.jeremy.guillot@maxicoffee.domains
2026-03-26 17:55:12 +01:00
parent 5a0888eb28
commit 5ed303612a
371 changed files with 6194 additions and 4160 deletions

View File

@@ -30,7 +30,7 @@ class InMemoryMangaRepository implements MangaRepositoryInterface
$valueA = $this->getPropertyValue($a, $sortBy);
$valueB = $this->getPropertyValue($b, $sortBy);
return $sortOrder === 'asc'
return 'asc' === $sortOrder
? $valueA <=> $valueB
: $valueB <=> $valueA;
});
@@ -57,6 +57,7 @@ class InMemoryMangaRepository implements MangaRepositoryInterface
return $manga;
}
}
return null;
}
@@ -105,10 +106,10 @@ class InMemoryMangaRepository implements MangaRepositoryInterface
private function getPropertyValue(Manga $manga, string $property): mixed
{
return match($property) {
return match ($property) {
'title' => $manga->getTitle()->getValue(),
'publicationYear' => $manga->getPublicationYear(),
default => throw new \InvalidArgumentException("Unknown sort property: $property")
default => throw new \InvalidArgumentException("Unknown sort property: $property"),
};
}
@@ -121,7 +122,7 @@ class InMemoryMangaRepository implements MangaRepositoryInterface
$chapters = $this->chapters[$mangaId];
usort($chapters, function (Chapter $a, Chapter $b) use ($sortOrder) {
return $sortOrder === 'desc'
return 'desc' === $sortOrder
? $b->getNumber() <=> $a->getNumber()
: $a->getNumber() <=> $b->getNumber();
});
@@ -138,12 +139,13 @@ class InMemoryMangaRepository implements MangaRepositoryInterface
$chapters = $this->chapters[$mangaId];
usort($chapters, function (Chapter $a, Chapter $b) use ($sortOrder) {
return $sortOrder === 'desc'
return 'desc' === $sortOrder
? $b->getNumber() <=> $a->getNumber()
: $a->getNumber() <=> $b->getNumber();
});
$offset = ($page - 1) * $limit;
return array_slice($chapters, $offset, $limit);
}
@@ -171,6 +173,7 @@ class InMemoryMangaRepository implements MangaRepositoryInterface
if ($chapter && $chapter->isVisible()) {
return $chapter;
}
return null;
}
@@ -181,6 +184,7 @@ class InMemoryMangaRepository implements MangaRepositoryInterface
return $chapter;
}
}
return null;
}
@@ -196,10 +200,9 @@ class InMemoryMangaRepository implements MangaRepositoryInterface
{
return array_values(array_filter(
$this->chaptersById,
fn (Chapter $chapter) =>
$chapter->getMangaId()->getValue() === $mangaId &&
$chapter->getVolume() === $volume &&
$chapter->isVisible()
fn (Chapter $chapter) => $chapter->getMangaId()->getValue() === $mangaId
&& $chapter->getVolume() === $volume
&& $chapter->isVisible()
));
}
@@ -207,11 +210,10 @@ class InMemoryMangaRepository implements MangaRepositoryInterface
{
return array_values(array_filter(
$this->chaptersById,
fn (Chapter $chapter) =>
$chapter->getMangaId()->getValue() === $mangaId &&
$chapter->getVolume() === $volume &&
$chapter->isVisible() &&
$chapter->isAvailable()
fn (Chapter $chapter) => $chapter->getMangaId()->getValue() === $mangaId
&& $chapter->getVolume() === $volume
&& $chapter->isVisible()
&& $chapter->isAvailable()
));
}
@@ -228,13 +230,13 @@ class InMemoryMangaRepository implements MangaRepositoryInterface
{
$this->chapters[$mangaId] = [];
for ($i = 1; $i <= $count; $i++) {
for ($i = 1; $i <= $count; ++$i) {
$chapter = new Chapter(
id: new ChapterId((string)$i),
id: new ChapterId((string) $i),
mangaId: new MangaId($mangaId),
number: (float)$i,
number: (float) $i,
title: "Chapter $i",
volume: (int)ceil($i / 10),
volume: (int) ceil($i / 10),
isVisible: true,
createdAt: new \DateTimeImmutable()
);
@@ -250,6 +252,7 @@ class InMemoryMangaRepository implements MangaRepositoryInterface
return $manga;
}
}
return null;
}
@@ -267,7 +270,7 @@ class InMemoryMangaRepository implements MangaRepositoryInterface
$manga->getTitle()->getValue(),
$manga->getSlug()->getValue(),
$manga->getAuthor(),
$manga->getDescription()
$manga->getDescription(),
];
foreach ($manga->getAlternativeSlugs() as $altSlug) {
@@ -287,6 +290,7 @@ class InMemoryMangaRepository implements MangaRepositoryInterface
usort($sortedMangas, fn (Manga $a, Manga $b) => $a->getTitle()->getValue() <=> $b->getTitle()->getValue());
$offset = ($page - 1) * $limit;
return array_slice($sortedMangas, $offset, $limit);
}
@@ -320,9 +324,9 @@ class InMemoryMangaRepository implements MangaRepositoryInterface
return false;
}
if ($criteria->lastCheckBefore !== null) {
if (null !== $criteria->lastCheckBefore) {
$lastCheck = $manga->getLastMonitoringCheck();
if ($lastCheck === null || $lastCheck >= $criteria->lastCheckBefore) {
if (null === $lastCheck || $lastCheck >= $criteria->lastCheckBefore) {
return false;
}
}