From af60a51bb38ff47006a87cf178353e648bf48bb6 Mon Sep 17 00:00:00 2001 From: Marijn Doeve Date: Mon, 9 Mar 2026 23:32:48 +0100 Subject: [PATCH] Refactor for code consistency and type safety assertions across repositories and entities --- phpstan.dist.neon | 2 ++ src/Controller/Backoffice/QuizController.php | 3 ++- src/Entity/Quiz.php | 6 +++--- src/Repository/QuizCandidateRepository.php | 5 +++-- src/Repository/QuizRepository.php | 22 ++++++++++++-------- 5 files changed, 23 insertions(+), 15 deletions(-) diff --git a/phpstan.dist.neon b/phpstan.dist.neon index 149767b..45c4582 100644 --- a/phpstan.dist.neon +++ b/phpstan.dist.neon @@ -7,6 +7,8 @@ parameters: - public/ - src/ - tests/ + excludePaths: + - config/reference.php treatPhpDocTypesAsCertain: false symfony: containerXmlPath: var/cache/dev/Tvdt_KernelDevDebugContainer.xml diff --git a/src/Controller/Backoffice/QuizController.php b/src/Controller/Backoffice/QuizController.php index 3d5c4b2..bb4bc3f 100644 --- a/src/Controller/Backoffice/QuizController.php +++ b/src/Controller/Backoffice/QuizController.php @@ -96,6 +96,7 @@ class QuizController extends AbstractController $fetchedQuiz = $this->quizRepository->fetchWithQuestions($quiz->id); \assert($fetchedQuiz->questions->count() > 0); $firstQuestion = $fetchedQuiz->questions->first(); + \assert($firstQuestion instanceof Question); return $this->redirectToRoute('tvdt_backoffice_quiz_candidates_question', [ 'seasonCode' => $season->seasonCode, @@ -264,7 +265,7 @@ class QuizController extends AbstractController 'candidate' => $candidate, ]); - if (!$quizCandidate instanceof \Tvdt\Entity\QuizCandidate) { + if (!$quizCandidate instanceof QuizCandidate) { // Create new QuizCandidate if it doesn't exist (inactive by default when first toggling) $quizCandidate = new QuizCandidate($quiz, $candidate); $quizCandidate->active = false; diff --git a/src/Entity/Quiz.php b/src/Entity/Quiz.php index e067d1c..404d095 100644 --- a/src/Entity/Quiz.php +++ b/src/Entity/Quiz.php @@ -155,9 +155,9 @@ class Quiz } } - if ($missing !== [] || $duplicates !== []) { + if ([] !== $missing || [] !== $duplicates) { $errors = []; - if ($missing !== []) { + if ([] !== $missing) { // If all active candidates are missing, show a special message if (\count($missing) === \count($activeCandidates)) { $errors[] = 'No candidates assigned to this question'; @@ -166,7 +166,7 @@ class Quiz } } - if ($duplicates !== []) { + if ([] !== $duplicates) { $errors[] = 'Duplicate candidates: '.implode(', ', $duplicates); } diff --git a/src/Repository/QuizCandidateRepository.php b/src/Repository/QuizCandidateRepository.php index a9b32cb..791238c 100644 --- a/src/Repository/QuizCandidateRepository.php +++ b/src/Repository/QuizCandidateRepository.php @@ -6,6 +6,7 @@ namespace Tvdt\Repository; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Persistence\ManagerRegistry; +use Safe\DateTimeImmutable; use Tvdt\Entity\Candidate; use Tvdt\Entity\Quiz; use Tvdt\Entity\QuizCandidate; @@ -33,7 +34,7 @@ class QuizCandidateRepository extends ServiceEntityRepository // If QuizCandidate exists but hasn't started yet, set the started timestamp if (null === $quizCandidate->started) { - $quizCandidate->started = new \DateTimeImmutable(); + $quizCandidate->started = new DateTimeImmutable(); $this->getEntityManager()->flush(); } @@ -41,7 +42,7 @@ class QuizCandidateRepository extends ServiceEntityRepository } $quizCandidate = new QuizCandidate($quiz, $candidate); - $quizCandidate->started = new \Safe\DateTimeImmutable(); + $quizCandidate->started = new DateTimeImmutable(); $this->getEntityManager()->persist($quizCandidate); $this->getEntityManager()->flush(); diff --git a/src/Repository/QuizRepository.php b/src/Repository/QuizRepository.php index 013decb..cb0af3b 100644 --- a/src/Repository/QuizRepository.php +++ b/src/Repository/QuizRepository.php @@ -96,15 +96,19 @@ class QuizRepository extends ServiceEntityRepository DQL )->setParameter('quiz', $quiz)->getResult(); - return array_map(static fn (array $row): Result => new Result( - id: $row['id'], - name: $row['name'], - correct: (int) $row['correct'], - corrections: $row['corrections'], - penaltySeconds: $row['penaltySeconds'], - time: $row['start_time']->diff(new DateTimeImmutable($row['end_time'])), - score: $row['score'], - ), $result); + return array_map(static function (array $row): Result { + \assert($row['start_time'] instanceof \DateTimeImmutable); + + return new Result( + id: $row['id'], + name: $row['name'], + correct: (int) $row['correct'], + corrections: $row['corrections'], + penaltySeconds: $row['penaltySeconds'], + time: $row['start_time']->diff(new DateTimeImmutable($row['end_time'])), + score: $row['score'], + ); + }, $result); } public function fetchWithQuestions(Uuid $id): Quiz