Skip to content

Commit 0c16bff

Browse files
committed
Refresh routes when an entity is created
1 parent 18c1a27 commit 0c16bff

File tree

4 files changed

+15
-6
lines changed

4 files changed

+15
-6
lines changed

src/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ private function registerCacheConfiguration(ContainerBuilder $container)
258258
*/
259259
private function registerLoaders(ContainerBuilder $container, array $bundles)
260260
{
261-
$annotationPaths = [];
261+
$resourceClassDirectories = [];
262262
$yamlResources = [];
263263
$xmlResources = [];
264264

@@ -267,12 +267,13 @@ private function registerLoaders(ContainerBuilder $container, array $bundles)
267267
$this->addFileResources($bundleDirectory, $xmlResources, $yamlResources);
268268

269269
if (file_exists($entityDirectory = $bundleDirectory.'/Entity')) {
270-
$annotationPaths[] = $entityDirectory;
270+
$resourceClassDirectories[] = $entityDirectory;
271271
$container->addResource(new DirectoryResource($entityDirectory, '/\.php$/'));
272272
}
273273
}
274274

275-
$container->getDefinition('api_platform.metadata.resource.name_collection_factory.annotation')->addArgument($annotationPaths);
275+
$container->setParameter('api_platform.resource_class_directories', $resourceClassDirectories);
276+
$container->getDefinition('api_platform.metadata.resource.name_collection_factory.annotation')->addArgument('%api_platform.resource_class_directories%');
276277
$container->getDefinition('api_platform.metadata.extractor.yaml')->addArgument($yamlResources);
277278
$container->getDefinition('api_platform.metadata.extractor.xml')->addArgument($xmlResources);
278279
}

src/Bridge/Symfony/Bundle/Resources/config/api.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
<argument type="service" id="api_platform.operation_path_resolver.custom" />
3636
<argument type="service" id="service_container" />
3737
<argument>%api_platform.formats%</argument>
38+
<argument>%api_platform.resource_class_directories%</argument>
3839

3940
<tag name="routing.loader" />
4041
</service>

src/Bridge/Symfony/Routing/ApiLoader.php

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
use Doctrine\Common\Inflector\Inflector;
2222
use Symfony\Component\Config\FileLocator;
2323
use Symfony\Component\Config\Loader\Loader;
24+
use Symfony\Component\Config\Resource\DirectoryResource;
2425
use Symfony\Component\DependencyInjection\ContainerInterface;
2526
use Symfony\Component\HttpKernel\KernelInterface;
2627
use Symfony\Component\Routing\Loader\XmlFileLoader;
@@ -43,23 +44,28 @@ final class ApiLoader extends Loader
4344
private $operationPathResolver;
4445
private $container;
4546
private $formats;
47+
private $resourceClassDirectories;
4648

47-
public function __construct(KernelInterface $kernel, ResourceNameCollectionFactoryInterface $resourceNameCollectionFactory, ResourceMetadataFactoryInterface $resourceMetadataFactory, OperationPathResolverInterface $operationPathResolver, ContainerInterface $container, array $formats)
49+
public function __construct(KernelInterface $kernel, ResourceNameCollectionFactoryInterface $resourceNameCollectionFactory, ResourceMetadataFactoryInterface $resourceMetadataFactory, OperationPathResolverInterface $operationPathResolver, ContainerInterface $container, array $formats, array $resourceClassDirectories = [])
4850
{
4951
$this->fileLoader = new XmlFileLoader(new FileLocator($kernel->locateResource('@ApiPlatformBundle/Resources/config/routing')));
5052
$this->resourceNameCollectionFactory = $resourceNameCollectionFactory;
5153
$this->resourceMetadataFactory = $resourceMetadataFactory;
5254
$this->operationPathResolver = $operationPathResolver;
5355
$this->container = $container;
5456
$this->formats = $formats;
57+
$this->resourceClassDirectories = $resourceClassDirectories;
5558
}
5659

5760
/**
5861
* {@inheritdoc}
5962
*/
60-
public function load($data, $type = null)
63+
public function load($data, $type = null): RouteCollection
6164
{
6265
$routeCollection = new RouteCollection();
66+
foreach ($this->resourceClassDirectories as $directory) {
67+
$routeCollection->addResource(new DirectoryResource($directory, '/\.php$/'));
68+
}
6369

6470
$this->loadExternalFiles($routeCollection);
6571

tests/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtensionTest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ private function getContainerBuilderProphecy()
210210
'api_platform.eager_loading.enabled' => Argument::type('bool'),
211211
'api_platform.eager_loading.max_joins' => 30,
212212
'api_platform.eager_loading.force_eager' => true,
213+
'api_platform.resource_class_directories' => [],
213214
];
214215
foreach ($parameters as $key => $value) {
215216
$containerBuilderProphecy->setParameter($key, $value)->shouldBeCalled();
@@ -219,7 +220,7 @@ private function getContainerBuilderProphecy()
219220
$containerBuilderProphecy->hasExtension('http://symfony.com/schema/dic/services')->shouldBeCalled();
220221

221222
$definitionProphecy = $this->prophesize(Definition::class);
222-
$definitionProphecy->addArgument([])->shouldBeCalled();
223+
$definitionProphecy->addArgument('%api_platform.resource_class_directories%')->shouldBeCalled();
223224
$containerBuilderProphecy->getDefinition('api_platform.metadata.resource.name_collection_factory.annotation')->willReturn($definitionProphecy->reveal())->shouldBeCalled();
224225

225226
foreach (['yaml', 'xml'] as $format) {

0 commit comments

Comments
 (0)