diff --git a/project/config/packages/cache.yaml b/project/config/packages/cache.yaml index 0bc8dfa..fb039c5 100644 --- a/project/config/packages/cache.yaml +++ b/project/config/packages/cache.yaml @@ -10,6 +10,10 @@ framework: # Redis app: cache.adapter.redis system: cache.adapter.redis + default_redis_provider: '%env(REDIS_URL)%' + pools: + database.cache: + adapter: cache.adapter.redis # APCu (not recommended with heavy random-write workloads as memory fragmentation can cause perf issues) #app: cache.adapter.apcu diff --git a/project/config/packages/doctrine.yaml b/project/config/packages/doctrine.yaml index d42c52d..429649c 100644 --- a/project/config/packages/doctrine.yaml +++ b/project/config/packages/doctrine.yaml @@ -15,6 +15,24 @@ doctrine: validate_xml_mapping: true naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware auto_mapping: true + second_level_cache: + enabled: true + regions: + user_cache: + lifetime: 8640000 + cache_driver: { type: service, id: database.cache } + schedule_cache: + lifetime: 864000 + cache_driver: { type: service, id: database.cache } + report_cache: + lifetime: 864000 + cache_driver: { type: service, id: database.cache } + client_cache: + lifetime: 864000 + cache_driver: { type: service, id: database.cache } + default_cache: + lifetime: 864000 + cache_driver: { type: service, id: database.cache } mappings: App: type: attribute diff --git a/project/src/Controller/BaseController.php b/project/src/Controller/BaseController.php index 0de3ac8..1d84ac4 100644 --- a/project/src/Controller/BaseController.php +++ b/project/src/Controller/BaseController.php @@ -23,6 +23,7 @@ use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; use Symfony\Component\Security\Http\Attribute\IsGranted; +use Symfony\Contracts\Cache\CacheInterface; class BaseController extends AbstractController { @@ -42,14 +43,14 @@ class BaseController extends AbstractController } #[Route('/reports/{monthId}', name: 'app_base')] #[IsGranted('reportView')] - public function reportsIndex(EntityManagerInterface $entityManager, int $monthId = 0) : Response + public function reportsIndex(EntityManagerInterface $entityManager, CacheInterface $cache, int $monthId = 0) : Response { $isOverdue = false; + $monthCurrent = $this->monthHelper->getCurrentMonth($monthId); + $reportsAll = $this->takeReportsAll($entityManager,$cache,$monthCurrent); + if ($monthId > -1) { - $monthCurrent = $this->monthHelper->getCurrentMonth($monthId); - $reportsAll = $entityManager->getRepository(Reports::class)->findAllInMonth($monthCurrent); } else { - $reportsAll = $entityManager->getRepository(Reports::class)->findAllOverdue(); $isOverdue = true; } @@ -73,4 +74,15 @@ class BaseController extends AbstractController 'isOverdue' => $isOverdue, ]); } + + private function takeReportsAll(EntityManagerInterface $entityManager, CacheInterface $cache, ?\DateTime $monthCurrent = null) : array + { + if ($monthCurrent !== null) { + $ret = $entityManager->getRepository(Reports::class)->findAllInMonth($monthCurrent); + } else { + $ret = $entityManager->getRepository(Reports::class)->findAllOverdue(); + } + + return $ret; + } } diff --git a/project/src/Controller/ClientController.php b/project/src/Controller/ClientController.php index f1c5c1a..1d4d66a 100644 --- a/project/src/Controller/ClientController.php +++ b/project/src/Controller/ClientController.php @@ -76,6 +76,7 @@ class ClientController extends AbstractController $newClient = $form->getData(); $entityManager->persist($newClient); $entityManager->flush(); + $entityManager->getCache()->evictEntityRegion(Clients::class); if (!$isEdit) { $addReports->setClient($newClient); $addReports->init(); diff --git a/project/src/Controller/ReportsController.php b/project/src/Controller/ReportsController.php index b4f759f..51a3381 100644 --- a/project/src/Controller/ReportsController.php +++ b/project/src/Controller/ReportsController.php @@ -48,6 +48,7 @@ class ReportsController extends AbstractController $report->setDone($isDone); $entityManager->persist($report); $entityManager->flush(); + $entityManager->getCache()->evictCollection(Reports::class,"reportsTodos",$report->getId()); $reportsService->tryAddNextReport(); } return $this->redirect($request->headers->get('referer')); diff --git a/project/src/Entity/Clients.php b/project/src/Entity/Clients.php index 5d10961..23684f7 100644 --- a/project/src/Entity/Clients.php +++ b/project/src/Entity/Clients.php @@ -9,6 +9,7 @@ use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; #[ORM\Entity(repositoryClass: ClientsRepository::class)] +#[ORM\Cache(usage: 'NONSTRICT_READ_WRITE', region: 'client_cache')] class Clients { #[ORM\Id] diff --git a/project/src/Entity/Notes.php b/project/src/Entity/Notes.php index 870513f..2804b9d 100644 --- a/project/src/Entity/Notes.php +++ b/project/src/Entity/Notes.php @@ -7,6 +7,7 @@ use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; #[ORM\Entity(repositoryClass: NotesRepository::class)] +#[ORM\Cache(usage: 'NONSTRICT_READ_WRITE', region: 'default_cache')] class Notes { #[ORM\Id] diff --git a/project/src/Entity/Reports.php b/project/src/Entity/Reports.php index 45148c8..e91880d 100644 --- a/project/src/Entity/Reports.php +++ b/project/src/Entity/Reports.php @@ -11,6 +11,8 @@ use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; #[ORM\Entity(repositoryClass: ReportsRepository::class)] +#[ORM\Cache(usage: 'NONSTRICT_READ_WRITE', region: 'report_cache')] + class Reports { #[ORM\Id] @@ -29,6 +31,7 @@ class Reports * @var Collection */ #[ORM\OneToMany(targetEntity: ReportsTodo::class, mappedBy: 'report', orphanRemoval: true)] + #[ORM\Cache(usage: 'READ_ONLY', region: 'report_cache')] private Collection $reportsTodos; diff --git a/project/src/Entity/ReportsTodo.php b/project/src/Entity/ReportsTodo.php index 29396d2..207b23e 100644 --- a/project/src/Entity/ReportsTodo.php +++ b/project/src/Entity/ReportsTodo.php @@ -9,6 +9,7 @@ use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; #[ORM\Entity(repositoryClass: ReportsTodoRepository::class)] +#[ORM\Cache(usage: 'NONSTRICT_READ_WRITE', region: 'report_cache')] class ReportsTodo { #[ORM\Id] @@ -19,7 +20,7 @@ class ReportsTodo #[ORM\Column(type: Types::SMALLINT, enumType: ReportTodoEnum::class)] private ?ReportTodoEnum $name = null; - #[ORM\ManyToOne] + #[ORM\ManyToOne(inversedBy: 'reportsTodos')] #[ORM\JoinColumn(referencedColumnName: 'id', nullable: false)] private ?Reports $report = null; diff --git a/project/src/Entity/Schedule.php b/project/src/Entity/Schedule.php index 0b4fb68..779bca2 100644 --- a/project/src/Entity/Schedule.php +++ b/project/src/Entity/Schedule.php @@ -8,6 +8,7 @@ use Doctrine\DBAL\Types\Types; use Doctrine\ORM\Mapping as ORM; #[ORM\Entity(repositoryClass: ScheduleRepository::class)] +#[ORM\Cache(usage: 'NONSTRICT_READ_WRITE', region: 'schedule_cache')] class Schedule { #[ORM\Id] diff --git a/project/src/Entity/User.php b/project/src/Entity/User.php index e981e72..fed13aa 100644 --- a/project/src/Entity/User.php +++ b/project/src/Entity/User.php @@ -11,6 +11,7 @@ use Symfony\Component\Security\Core\User\UserInterface; #[ORM\Entity(repositoryClass: UserRepository::class)] #[ORM\UniqueConstraint(name: 'UNIQ_IDENTIFIER_USERNAME', fields: ['username'])] +#[ORM\Cache(usage: 'READ_ONLY', region: 'user_cache')] class User implements UserInterface, PasswordAuthenticatedUserInterface { #[ORM\Id] diff --git a/project/src/Helper/MonthHelper.php b/project/src/Helper/MonthHelper.php index e060632..9e890d8 100644 --- a/project/src/Helper/MonthHelper.php +++ b/project/src/Helper/MonthHelper.php @@ -17,8 +17,11 @@ class MonthHelper } - public function getCurrentMonth(int $monthId) : \DateTime + public function getCurrentMonth(int $monthId) : ?\DateTime { + if ($monthId < 0) { + return null; + } $months = $this->takeMonths(); if ($monthId==0) { $currentMonth = intval(date("n")); diff --git a/project/src/Services/AddReports.php b/project/src/Services/AddReports.php index 8e3868c..632785d 100644 --- a/project/src/Services/AddReports.php +++ b/project/src/Services/AddReports.php @@ -84,6 +84,7 @@ class AddReports $report->setNumber($numberOfReports + 1); $this->manager->persist($report); $this->manager->flush(); + $this->manager->getCache()->evictEntityRegion(Reports::class); } return true; } @@ -107,6 +108,7 @@ class AddReports $report->setDateStart($dateToReport->modify("+".self::NEXT_REPORT_MONTH." months")); $this->manager->persist($report); $this->manager->flush(); + $this->manager->getCache()->evictEntityRegion(Reports::class); return true; } } \ No newline at end of file