diff --git a/src/Bridge/Doctrine/Orm/Extension/FilterEagerLoadingExtension.php b/src/Bridge/Doctrine/Orm/Extension/FilterEagerLoadingExtension.php index 97eb130a382..b1f6ecd0b49 100644 --- a/src/Bridge/Doctrine/Orm/Extension/FilterEagerLoadingExtension.php +++ b/src/Bridge/Doctrine/Orm/Extension/FilterEagerLoadingExtension.php @@ -160,7 +160,7 @@ private function hasFetchEagerAssociation(EntityManager $em, ClassMetadataInfo $ $related = $em->getClassMetadata($mapping['targetEntity']); - if (in_array($related->name, $checked)) { + if (in_array($related->name, $checked, true)) { continue; } diff --git a/src/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php b/src/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php index 4d9ab000c8f..b246dfd7522 100644 --- a/src/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php +++ b/src/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php @@ -258,7 +258,7 @@ private function registerCacheConfiguration(ContainerBuilder $container) */ private function registerLoaders(ContainerBuilder $container, array $bundles) { - $annotationPaths = []; + $resourceClassDirectories = []; $yamlResources = []; $xmlResources = []; @@ -267,12 +267,13 @@ private function registerLoaders(ContainerBuilder $container, array $bundles) $this->addFileResources($bundleDirectory, $xmlResources, $yamlResources); if (file_exists($entityDirectory = $bundleDirectory.'/Entity')) { - $annotationPaths[] = $entityDirectory; + $resourceClassDirectories[] = $entityDirectory; $container->addResource(new DirectoryResource($entityDirectory, '/\.php$/')); } } - $container->getDefinition('api_platform.metadata.resource.name_collection_factory.annotation')->addArgument($annotationPaths); + $container->setParameter('api_platform.resource_class_directories', $resourceClassDirectories); + $container->getDefinition('api_platform.metadata.resource.name_collection_factory.annotation')->addArgument('%api_platform.resource_class_directories%'); $container->getDefinition('api_platform.metadata.extractor.yaml')->addArgument($yamlResources); $container->getDefinition('api_platform.metadata.extractor.xml')->addArgument($xmlResources); } diff --git a/src/Bridge/Symfony/Bundle/Resources/config/api.xml b/src/Bridge/Symfony/Bundle/Resources/config/api.xml index 27337a1fa19..b0ebd87f737 100644 --- a/src/Bridge/Symfony/Bundle/Resources/config/api.xml +++ b/src/Bridge/Symfony/Bundle/Resources/config/api.xml @@ -35,6 +35,7 @@ %api_platform.formats% + %api_platform.resource_class_directories% diff --git a/src/Bridge/Symfony/Routing/ApiLoader.php b/src/Bridge/Symfony/Routing/ApiLoader.php index 1a13c76688d..24cb18cc4ea 100644 --- a/src/Bridge/Symfony/Routing/ApiLoader.php +++ b/src/Bridge/Symfony/Routing/ApiLoader.php @@ -21,6 +21,7 @@ use Doctrine\Common\Inflector\Inflector; use Symfony\Component\Config\FileLocator; use Symfony\Component\Config\Loader\Loader; +use Symfony\Component\Config\Resource\DirectoryResource; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpKernel\KernelInterface; use Symfony\Component\Routing\Loader\XmlFileLoader; @@ -43,8 +44,9 @@ final class ApiLoader extends Loader private $operationPathResolver; private $container; private $formats; + private $resourceClassDirectories; - public function __construct(KernelInterface $kernel, ResourceNameCollectionFactoryInterface $resourceNameCollectionFactory, ResourceMetadataFactoryInterface $resourceMetadataFactory, OperationPathResolverInterface $operationPathResolver, ContainerInterface $container, array $formats) + public function __construct(KernelInterface $kernel, ResourceNameCollectionFactoryInterface $resourceNameCollectionFactory, ResourceMetadataFactoryInterface $resourceMetadataFactory, OperationPathResolverInterface $operationPathResolver, ContainerInterface $container, array $formats, array $resourceClassDirectories = []) { $this->fileLoader = new XmlFileLoader(new FileLocator($kernel->locateResource('@ApiPlatformBundle/Resources/config/routing'))); $this->resourceNameCollectionFactory = $resourceNameCollectionFactory; @@ -52,14 +54,18 @@ public function __construct(KernelInterface $kernel, ResourceNameCollectionFacto $this->operationPathResolver = $operationPathResolver; $this->container = $container; $this->formats = $formats; + $this->resourceClassDirectories = $resourceClassDirectories; } /** * {@inheritdoc} */ - public function load($data, $type = null) + public function load($data, $type = null): RouteCollection { $routeCollection = new RouteCollection(); + foreach ($this->resourceClassDirectories as $directory) { + $routeCollection->addResource(new DirectoryResource($directory, '/\.php$/')); + } $this->loadExternalFiles($routeCollection); diff --git a/tests/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtensionTest.php b/tests/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtensionTest.php index 87b094f454d..24da5be5ebe 100644 --- a/tests/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtensionTest.php +++ b/tests/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtensionTest.php @@ -210,6 +210,7 @@ private function getContainerBuilderProphecy() 'api_platform.eager_loading.enabled' => Argument::type('bool'), 'api_platform.eager_loading.max_joins' => 30, 'api_platform.eager_loading.force_eager' => true, + 'api_platform.resource_class_directories' => [], ]; foreach ($parameters as $key => $value) { $containerBuilderProphecy->setParameter($key, $value)->shouldBeCalled(); @@ -219,7 +220,7 @@ private function getContainerBuilderProphecy() $containerBuilderProphecy->hasExtension('http://symfony.com/schema/dic/services')->shouldBeCalled(); $definitionProphecy = $this->prophesize(Definition::class); - $definitionProphecy->addArgument([])->shouldBeCalled(); + $definitionProphecy->addArgument('%api_platform.resource_class_directories%')->shouldBeCalled(); $containerBuilderProphecy->getDefinition('api_platform.metadata.resource.name_collection_factory.annotation')->willReturn($definitionProphecy->reveal())->shouldBeCalled(); foreach (['yaml', 'xml'] as $format) {