Source of file ManagerTrait.php
Size: 5,338 Bytes - Last Modified: 2023-11-16T22:56:02+01:00
/home/websites/teicee/packagist/site/phpdoc/conf/../vendor/teicee/dorm-bundle/src/Traits/ManagerTrait.php
| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175 | <?phpnamespace TIC\DormBundle\Traits; use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityRepository; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** * Injection du manager Doctrine + méthodes utilitaires pour gérer les entités : * notamment getRepo(), getItem(), saveEntity() et deleteEntity() */trait ManagerTrait {// Initialisation automatique des propriétés à partir du nom de la classe courante use \TIC\CoreBundle\Traits\ContextProperties; // ctxRoot, ctxName & ctxMesg /** * @var EntityManagerInterface */protected $em; /** * DI avec auto-wiring (inutile de définir le "call" sur le service grace à l'attribut @required). * @see https://symfony.com/doc/current/service_container/injection_types.html#setter-injection * @see https://symfony.com/doc/current/service_container/autowiring.html#autowiring-other-methods-e-g-setters-and-public-typed-properties * * @required */public function setEntityManager(EntityManagerInterface $manager): void { $this->em = $manager; } /** * Désactivation du journal de l'ORM (optimisation en cas de nombreuses requêtes). */public function EmDisableLogger(): void { $this->em->getConnection()->getConfiguration()->setSQLLogger(null); } /** * Désactivation d'un filtre de l'ORM (seulement si l'extension est activée). */public function EmDisableFilter(string $filter): bool { # $this->em->getFilters()->disable($filter);$filters = $this->em->getFilters(); if (\array_key_exists($filter, $filters->getEnabledFilters())) { $filters->disable($filter); return true; } return false; } /** * Activation d'un filtre de l'ORM (seulement si l'extension est désactivée). */public function EmEnableFilter(string $filter): bool { # $this->em->getFilters()->enable($filter);$filters = $this->em->getFilters(); if (\array_key_exists($filter, $filters->getDisabledFilters())) { $filters->enable($filter); return true; } return false; } /** * Raccourci pour obtenir le repository d'une entité (en utilisant le contexte de la classe). * * @param string|null $itemName Nom court de l'entité (par défaut celle associée à la classe courante) * ou nom complet (si besoin d'un repository provenant d'un autre bundle) * @return EntityRepository */protected function getRepo(?string $itemName = null): EntityRepository { if ($itemName === null) $entityClass = $this->ctxRoot . "\\Entity\\" . $this->ctxName; elseif (!str_contains($itemName, "\\")) $entityClass = $this->ctxRoot . "\\Entity\\" . \ucfirst($itemName); else $entityClass = $itemName; return $this->em->getRepository($entityClass); } /** * Raccourci pour rechercher dans la BdD l'instance de l'entité correspondant à la clé donnée. * * @param mixed $primary Clé primaire (id) ou null pour création d'une instance * @param bool $no_exception Ne pas lancer d'exception si l'entité n'est pas trouvée (retourne null) * @return object|null Instance de l'entité créée ou récupérée selon la clé primaire */protected function getItem(mixed $primary = null, ?bool $no_exception = false): ?object { // create if (null === $primary) { $entityClass = $this->ctxRoot . "\\Entity\\" . $this->ctxName; return new $entityClass(); } // update $entity = $this->getRepo()->getItem($primary); if (\is_object($entity)) return $entity; // notfound if (empty($no_exception)) { $message = 'error.' . $this->ctxMesg . '.object_not_found'; if (\method_exists($this, "trans")) $message = $this->trans($message); # throw $this->createNotFoundException($message); // dispo uniquement sur controllerthrow new NotFoundHttpException($message); } return null; } /** * Exécution de l'enregistrement d'une entité en BdD. * * @param object $entity Entité à enregistrer * @return string|null Message d'erreur ou null en cas de succès */protected function saveEntity(object $entity): ?string { try { # if (\method_exists($entity, 'hookSave')) $entity->hookSave();$this->em->persist($entity); $this->em->flush(); } catch (\Exception $e) { return $e->getMessage(); } return null; } /** * Exécution de la suppression d'une entité en BdD. * * @param object $entity Entité à supprimer * @return string|null Message d'erreur ou null en cas de succès */protected function deleteEntity(object $entity): ?string { try { # if (\method_exists($entity, 'hookDelete')) $entity->hookDelete();$this->em->remove($entity); $this->em->flush(); } catch (\Exception $e) { return $e->getMessage(); } return null; } /** * Exécution de la suppression d'une entité en BdD en coupant si possible le softdelete. * * @param object $entity Entité à supprimer * @return string|null Message d'erreur ou null en cas de succès */protected function harddeleteEntity(object $entity): ?string { $hasFilter = $this->EmDisableFilter('softdeleteable'); $rc = $this->deleteEntity($entity); if ($hasFilter) { $this->EmEnableFilter('softdeleteable'); if ($rc !== null) return $this->deleteEntity($entity); } return $rc; } } |