Skip to content

Commit

Permalink
Fix ORM driver with generic entity repository
Browse files Browse the repository at this point in the history
  • Loading branch information
loic425 committed Feb 14, 2025
1 parent 5dd7383 commit b1a311d
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
<?php

/*
* This file is part of the Sylius package.
*
* (c) Sylius Sp. z o.o.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace Sylius\Bundle\ResourceBundle\DependencyInjection\Compiler;

use Doctrine\ORM\Mapping\Entity;
use Sylius\Resource\Metadata\Metadata;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;

final class RegisterAliasesForDoctrineRepositoriesPass implements CompilerPassInterface
{
public function process(ContainerBuilder $container): void
{
if (!$container->hasParameter('sylius.resources')) {
return;
}

/** @var array $resources */
$resources = $container->getParameter('sylius.resources');

foreach ($resources as $resourceAlias => $configuration) {
$model = $configuration['classes']['model'] ?? null;

if (null === $model) {
continue;
}

$reflection = new \ReflectionClass($model);
$entityAttribute = $reflection->getAttributes(Entity::class)[0] ?? null;
$repositoryClass = $entityAttribute?->getArguments()['repositoryClass'] ?? null;

if (null === $repositoryClass) {
continue;
}

$metadata = Metadata::fromAliasAndConfiguration($resourceAlias, $configuration);
$repositoryAlias = $metadata->getServiceId('repository');

if (!$container->hasDefinition($repositoryClass)) {
continue;
}

$container->setAlias($repositoryAlias, $repositoryClass);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -64,9 +64,7 @@ protected function addRepository(ContainerBuilder $container, MetadataInterface
/** @var string $entityClass */
$entityClass = $metadata->getClass('model');

$definition->setFactory([$managerReference, 'getRepository']);
$definition->setArguments([$entityClass]);

$definition->setArguments([$managerReference, $this->getClassMetadataDefinition($metadata)]);
$container->setDefinition($serviceId, $definition);

$genericEntities[] = $entityClass;
Expand Down
2 changes: 2 additions & 0 deletions src/Bundle/SyliusResourceBundle.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
use Sylius\Bundle\ResourceBundle\DependencyInjection\Compiler\DoctrineTargetEntitiesResolverPass;
use Sylius\Bundle\ResourceBundle\DependencyInjection\Compiler\Helper\TargetEntitiesResolver;
use Sylius\Bundle\ResourceBundle\DependencyInjection\Compiler\PagerfantaBridgePass;
use Sylius\Bundle\ResourceBundle\DependencyInjection\Compiler\RegisterAliasesForDoctrineRepositoriesPass;
use Sylius\Bundle\ResourceBundle\DependencyInjection\Compiler\RegisterFormBuilderPass;
use Sylius\Bundle\ResourceBundle\DependencyInjection\Compiler\RegisterFqcnControllersPass;
use Sylius\Bundle\ResourceBundle\DependencyInjection\Compiler\RegisterResourceRepositoryPass;
Expand Down Expand Up @@ -50,6 +51,7 @@ public function build(ContainerBuilder $container): void

$container->addCompilerPass(new CsrfTokenManagerPass());
$container->addCompilerPass(new DisableMetadataCachePass());
$container->addCompilerPass(new RegisterAliasesForDoctrineRepositoriesPass());
$container->addCompilerPass(new DoctrineContainerRepositoryFactoryPass());
$container->addCompilerPass(new DoctrineTargetEntitiesResolverPass(new TargetEntitiesResolver()), PassConfig::TYPE_BEFORE_OPTIMIZATION, 1);
$container->addCompilerPass(new RegisterFormBuilderPass());
Expand Down

0 comments on commit b1a311d

Please sign in to comment.