Skip to content

Instantly share code, notes, and snippets.

@docteurklein
Last active October 17, 2017 11:39
Show Gist options
  • Star 20 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save docteurklein/9778800 to your computer and use it in GitHub Desktop.
Save docteurklein/9778800 to your computer and use it in GitHub Desktop.
Service Repository Factory
<?php
public function process(ContainerBuilder $container)
{
$factory = $container->findDefinition('app.doctrine.repository.factory');
$repositories = [];
foreach ($container->findTaggedServiceIds('app.repository') as $id => $params) {
foreach ($params as $param) {
$repositories[$param['class']] = $id;
$repository = $container->findDefinition($id);
$repository->replaceArgument(0, new Reference('doctrine.orm.default_entity_manager'));
$definition = new Definition;
$definition->setClass('Doctrine\ORM\Mapping\ClassMetadata');
$definition->setFactoryService('doctrine.orm.default_entity_manager');
$definition->setFactoryMethod('getClassMetadata');
$definition->setArguments([$param['class']]);
$repository->replaceArgument(1, $definition);
}
}
$factory->replaceArgument(0, $repositories);
$container->findDefinition('doctrine.orm.configuration')->addMethodCall('setRepositoryFactory', [$factory]);
}
<?php
namespace App\Doctrine\Repository;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Repository\RepositoryFactory;
class Factory implements RepositoryFactory
{
private $ids;
private $container;
private $default;
public function __construct(array $ids, ContainerInterface $container, RepositoryFactory $default)
{
$this->ids = $ids;
$this->container = $container;
$this->default = $default;
}
public function getRepository(EntityManagerInterface $entityManager, $entityName)
{
if (isset($this->ids[$entityName])) {
return $this->container->get($this->ids[$entityName]);
}
return $this->default->getRepository($entityManager, $entityName);
}
}
services:
app.doctrine.repository.factory:
class: App\Doctrine\Repository\Factory
arguments:
- []
- '@service_container'
- '@app.doctrine.repository.factory.default'
app.doctrine.repository.factory.default:
class: Doctrine\ORM\Repository\DefaultRepositoryFactory
@opalenet-yann
Copy link

since symfony 2.6 setFactoryMethod and setFactoryService are deprecated in favor of setFactory see http://symfony.com/doc/current/components/dependency_injection/factories.html

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment