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
<?php
namespace 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 controller
			throw 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;
	}

}