1 <?php 
declare(strict_types
=1); 
   4  * This file is part of the Rapsys AirBundle package. 
   6  * (c) Raphaël Gertz <symfony@rapsys.eu> 
   8  * For the full copyright and license information, please view the LICENSE 
   9  * file that was distributed with this source code. 
  12 namespace Rapsys\AirBundle
; 
  14 use Doctrine\ORM\EntityManagerInterface
; 
  15 use Doctrine\ORM\Repository\RepositoryFactory
; 
  16 use Doctrine\Persistence\ObjectRepository
; 
  17 use Symfony\Component\HttpFoundation\RequestStack
; 
  18 use Symfony\Component\Routing\RouterInterface
; 
  19 use Symfony\Contracts\Translation\TranslatorInterface
; 
  21 use Rapsys\PackBundle\Util\SluggerUtil
; 
  24  * This factory is used to create default repository objects for entities at runtime. 
  26 final class Factory 
implements RepositoryFactory 
{ 
  28          * The list of EntityRepository instances 
  30         private array $repositoryList = []; 
  33          * Initializes a new RepositoryFactory instance 
  35          * @param RequestStack $request The request stack 
  36          * @param RouterInterface $router The router instance 
  37          * @param SluggerUtil $slugger The SluggerUtil instance 
  38          * @param TranslatorInterface $translator The TranslatorInterface instance 
  39          * @param string $locale The current locale 
  40          * @param array $languages The languages list 
  42         public function __construct(private RequestStack 
$request, private RouterInterface 
$router, private SluggerUtil 
$slugger, private TranslatorInterface 
$translator, private string $locale, private array $languages) { 
  48         public function getRepository(EntityManagerInterface 
$entityManager, mixed $entityName): ObjectRepository 
{ 
  50                 $repositoryHash = $entityManager->getClassMetadata($entityName)->getName() . spl_object_hash($entityManager); 
  52                 //With entity repository instance 
  53                 if (isset($this->repositoryList
[$repositoryHash])) { 
  54                         //Return existing entity repository instance 
  55                         return $this->repositoryList
[$repositoryHash]; 
  58                 //Store and return created entity repository instance 
  59                 return $this->repositoryList
[$repositoryHash] = $this->createRepository($entityManager, $entityName); 
  63          * Create a new repository instance for an entity class 
  65          * @param EntityManagerInterface $entityManager The EntityManager instance. 
  66          * @param string $entityName The name of the entity. 
  68         private function createRepository(EntityManagerInterface 
$entityManager, string $entityName): ObjectRepository 
{ 
  70                 $metadata = $entityManager->getClassMetadata($entityName); 
  72                 //Get repository class 
  73                 $repositoryClass = $metadata->customRepositoryClassName 
?: $entityManager->getConfiguration()->getDefaultRepositoryClassName(); 
  75                 //Set to current locale 
  76                 //XXX: current request is not yet populated in constructor 
  77                 $this->locale 
= $this->request
->getCurrentRequest()->getLocale() ?? $this->locale
; 
  79                 //Return repository class instance 
  80                 //XXX: router, slugger, translator, languages and locale arguments will be ignored by default 
  81                 return new $repositoryClass($entityManager, $metadata, $this->router
, $this->slugger
, $this->translator
, $this->locale
, $this->languages
);