Skip to content

Commit b1a311d

Browse files
committed
Fix ORM driver with generic entity repository
1 parent 5dd7383 commit b1a311d

File tree

3 files changed

+60
-3
lines changed

3 files changed

+60
-3
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Sylius package.
5+
*
6+
* (c) Sylius Sp. z o.o.
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
declare(strict_types=1);
13+
14+
namespace Sylius\Bundle\ResourceBundle\DependencyInjection\Compiler;
15+
16+
use Doctrine\ORM\Mapping\Entity;
17+
use Sylius\Resource\Metadata\Metadata;
18+
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
19+
use Symfony\Component\DependencyInjection\ContainerBuilder;
20+
21+
final class RegisterAliasesForDoctrineRepositoriesPass implements CompilerPassInterface
22+
{
23+
public function process(ContainerBuilder $container): void
24+
{
25+
if (!$container->hasParameter('sylius.resources')) {
26+
return;
27+
}
28+
29+
/** @var array $resources */
30+
$resources = $container->getParameter('sylius.resources');
31+
32+
foreach ($resources as $resourceAlias => $configuration) {
33+
$model = $configuration['classes']['model'] ?? null;
34+
35+
if (null === $model) {
36+
continue;
37+
}
38+
39+
$reflection = new \ReflectionClass($model);
40+
$entityAttribute = $reflection->getAttributes(Entity::class)[0] ?? null;
41+
$repositoryClass = $entityAttribute?->getArguments()['repositoryClass'] ?? null;
42+
43+
if (null === $repositoryClass) {
44+
continue;
45+
}
46+
47+
$metadata = Metadata::fromAliasAndConfiguration($resourceAlias, $configuration);
48+
$repositoryAlias = $metadata->getServiceId('repository');
49+
50+
if (!$container->hasDefinition($repositoryClass)) {
51+
continue;
52+
}
53+
54+
$container->setAlias($repositoryAlias, $repositoryClass);
55+
}
56+
}
57+
}

src/Bundle/DependencyInjection/Driver/Doctrine/DoctrineORMDriver.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,7 @@ protected function addRepository(ContainerBuilder $container, MetadataInterface
6464
/** @var string $entityClass */
6565
$entityClass = $metadata->getClass('model');
6666

67-
$definition->setFactory([$managerReference, 'getRepository']);
68-
$definition->setArguments([$entityClass]);
69-
67+
$definition->setArguments([$managerReference, $this->getClassMetadataDefinition($metadata)]);
7068
$container->setDefinition($serviceId, $definition);
7169

7270
$genericEntities[] = $entityClass;

src/Bundle/SyliusResourceBundle.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use Sylius\Bundle\ResourceBundle\DependencyInjection\Compiler\DoctrineTargetEntitiesResolverPass;
1919
use Sylius\Bundle\ResourceBundle\DependencyInjection\Compiler\Helper\TargetEntitiesResolver;
2020
use Sylius\Bundle\ResourceBundle\DependencyInjection\Compiler\PagerfantaBridgePass;
21+
use Sylius\Bundle\ResourceBundle\DependencyInjection\Compiler\RegisterAliasesForDoctrineRepositoriesPass;
2122
use Sylius\Bundle\ResourceBundle\DependencyInjection\Compiler\RegisterFormBuilderPass;
2223
use Sylius\Bundle\ResourceBundle\DependencyInjection\Compiler\RegisterFqcnControllersPass;
2324
use Sylius\Bundle\ResourceBundle\DependencyInjection\Compiler\RegisterResourceRepositoryPass;
@@ -50,6 +51,7 @@ public function build(ContainerBuilder $container): void
5051

5152
$container->addCompilerPass(new CsrfTokenManagerPass());
5253
$container->addCompilerPass(new DisableMetadataCachePass());
54+
$container->addCompilerPass(new RegisterAliasesForDoctrineRepositoriesPass());
5355
$container->addCompilerPass(new DoctrineContainerRepositoryFactoryPass());
5456
$container->addCompilerPass(new DoctrineTargetEntitiesResolverPass(new TargetEntitiesResolver()), PassConfig::TYPE_BEFORE_OPTIMIZATION, 1);
5557
$container->addCompilerPass(new RegisterFormBuilderPass());

0 commit comments

Comments
 (0)