From 59e068fbf7f1c74b4a3db3edf652baf9e496989f Mon Sep 17 00:00:00 2001 From: Tim Date: Sun, 4 May 2025 16:47:39 +0200 Subject: [PATCH] Implement caching of query dto --- src/Controller/Attribute/MapQueryCached.php | 14 +++++ src/Controller/SnipController.php | 4 +- src/Controller/UserController.php | 9 ++- src/Dto/CachableDtoInterface.php | 8 +++ src/Dto/SnipFilterRequest.php | 2 +- src/Service/RequestDtoCache.php | 61 +++++++++++++++++++++ 6 files changed, 90 insertions(+), 8 deletions(-) create mode 100644 src/Controller/Attribute/MapQueryCached.php create mode 100644 src/Dto/CachableDtoInterface.php create mode 100644 src/Service/RequestDtoCache.php diff --git a/src/Controller/Attribute/MapQueryCached.php b/src/Controller/Attribute/MapQueryCached.php new file mode 100644 index 0000000..9cf69d3 --- /dev/null +++ b/src/Controller/Attribute/MapQueryCached.php @@ -0,0 +1,14 @@ +render('snip/index.html.twig', [ 'snips' => $this->repository->findByRequest($this->getUser(), $request), diff --git a/src/Controller/UserController.php b/src/Controller/UserController.php index 82985e3..c75051f 100644 --- a/src/Controller/UserController.php +++ b/src/Controller/UserController.php @@ -17,10 +17,8 @@ use Symfony\Component\Uid\Uuid; class UserController extends AbstractController { public function __construct( - private EntityManagerInterface $em, - ) - { - } + private readonly EntityManagerInterface $em, + ) {} #[Route('/profile', name: '_profile')] public function profile( @@ -45,7 +43,8 @@ class UserController extends AbstractController $user, $form->get('plainPassword')->getData() ) - ); + ) + ; } } $this->addFlash('success', 'Profile updated successfully'); diff --git a/src/Dto/CachableDtoInterface.php b/src/Dto/CachableDtoInterface.php new file mode 100644 index 0000000..5ff8d43 --- /dev/null +++ b/src/Dto/CachableDtoInterface.php @@ -0,0 +1,8 @@ +getSession(); + $className = $argument->getType(); + if (!$className || !is_subclass_of($className, CachableDtoInterface::class) + ) { + return []; + } + + $reflection = new ReflectionClass($className); + $constructor = $reflection->getConstructor(); + + if (!$constructor) { + return []; // No constructor: return empty instance + } + + $cacheKey = self::SESSION_CACHE_PREFIX . (implode('.', [ + $argument->getControllerName(), + $argument->getName(), + $className, + ])); + + $cacheData = $session->get($cacheKey, []); + $queryData = $request->query->all(); + $params = $constructor->getParameters(); + $args = []; + + foreach ($params as $param) { + $name = $param->getName(); + if (array_key_exists($name, $queryData)) { + $args[$name] = $queryData[$name]; + } elseif (array_key_exists($name, $cacheData)) { + $args[$name] = $cacheData[$name]; + } elseif ($param->isDefaultValueAvailable()) { + $args[$name] = $param->getDefaultValue(); + } else { + throw new InvalidArgumentException(sprintf('Missing required parameter "%s" for class "%s"', $name, $className)); + } + } + + // Store the cache data in the session + $session->set($cacheKey, $args); + + yield $reflection->newInstanceArgs($args); + } +} \ No newline at end of file