Skip to content

Commit 4408755

Browse files
committed
Add Resource Route Collection Factory
1 parent c98f1a3 commit 4408755

File tree

15 files changed

+369
-9
lines changed

15 files changed

+369
-9
lines changed

psalm.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,20 @@
4646
<DeprecatedClass>
4747
<errorLevel type="info">
4848
<referencedClass name="Doctrine\ORM\Event\LifecycleEventArgs" /> <!-- deprecated in doctrine/orm 2.14 -->
49+
</errorLevel>
50+
<errorLevel type="suppress">
4951
<referencedClass name="Sylius\Component\Resource\Exception\VariantWithNoOptionsValuesException" />
5052
<referencedClass name="Sylius\Resource\Exception\VariantWithNoOptionsValuesException" />
53+
<referencedClass name="Sylius\Resource\Symfony\Routing\Factory\AttributesOperationRouteFactory" />
5154
</errorLevel>
5255
</DeprecatedClass>
5356

57+
<DeprecatedInterface>
58+
<errorLevel type="suppress">
59+
<referencedClass name="Sylius\Resource\Symfony\Routing\Factory\AttributesOperationRouteFactoryInterface" />
60+
</errorLevel>
61+
</DeprecatedInterface>
62+
5463
<DeprecatedMethod>
5564
<errorLevel type="suppress">
5665
<referencedMethod name="Symfony\Component\EventDispatcher\Event::isPropagationStopped" />

src/Bundle/Resources/config/services/routing.xml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,10 @@
1212
-->
1313

1414
<container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
15+
<imports>
16+
<import resource="routing/**/**.xml" />
17+
</imports>
18+
1519
<services>
1620
<defaults public="true" />
1721

@@ -99,10 +103,14 @@
99103
<service id="sylius.routing.factory.route_attributes" class="Sylius\Bundle\ResourceBundle\Routing\RouteAttributesFactory" public="false" />
100104
<service id="Sylius\Bundle\ResourceBundle\Routing\RouteAttributesFactoryInterface" alias="sylius.routing.factory.route_attributes" />
101105

102-
<service id="sylius.routing.factory.attributes_operation_route" class="Sylius\Resource\Symfony\Routing\Factory\AttributesOperationRouteFactory" public="false">
106+
<service id="sylius.routing.factory.attributes_operation_route"
107+
class="Sylius\Resource\Symfony\Routing\Factory\AttributesOperationRouteFactory"
108+
public="false"
109+
>
103110
<argument type="service" id="sylius.resource_registry" />
104111
<argument type="service" id="sylius.routing.factory.operation_route" />
105112
<argument type="service" id="sylius.resource_metadata_collection.factory.attributes" />
113+
<deprecated package="sylius/resource-bundle" version="1.13">The "%service_id%" service is deprecated since sylius/resource-bundle 1.13 and will be removed in sylius/resource-bundle 2.0. Use sylius.routing.resource.route_collection_factory instead.</deprecated>
106114
</service>
107115
<service id="Sylius\Resource\Symfony\Routing\Factory\AttributesOperationRouteFactoryInterface" alias="sylius.routing.factory.attributes_operation_route" />
108116

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
3+
<!--
4+
5+
This file is part of the Sylius package.
6+
7+
(c) Sylius Sp. z o.o.
8+
9+
For the full copyright and license information, please view the LICENSE
10+
file that was distributed with this source code.
11+
12+
-->
13+
14+
<container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
15+
<services>
16+
<service id="sylius.symfony.routing.loader.resource" class="Sylius\Resource\Symfony\Routing\Loader\ResourceLoader">
17+
<argument type="service" id="sylius.metadata.resource_class_list.factory" />
18+
<argument type="service" id="sylius.routing.resource.route_collection_factory" />
19+
<tag name="routing.route_loader" />
20+
</service>
21+
<service id="Sylius\Resource\Symfony\Routing\Loader\ResourceLoader" alias="sylius.symfony.routing.loader.resource" />
22+
</services>
23+
</container>
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
3+
<!--
4+
5+
This file is part of the Sylius package.
6+
7+
(c) Sylius Sp. z o.o.
8+
9+
For the full copyright and license information, please view the LICENSE
10+
file that was distributed with this source code.
11+
12+
-->
13+
14+
<container xmlns="http://symfony.com/schema/dic/services" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">
15+
<services>
16+
<service id="sylius.routing.resource.route_collection_factory" class="Sylius\Resource\Symfony\Routing\Factory\Resource\ResourceRouteCollectionFactory">
17+
<argument type="service" id="sylius.routing.factory.operation_route" />
18+
<argument type="service" id="sylius.resource_metadata_collection.factory.attributes" />
19+
<argument type="service" id="sylius.resource_registry" />
20+
</service>
21+
<service id="Sylius\Resource\Symfony\Routing\Factory\Resource\ResourceRouteCollectionFactoryInterface" alias="sylius.routing.resource.route_collection_factory" />
22+
</services>
23+
</container>

src/Component/composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
"pagerfanta/core": "^3.7 || ^4.0",
3535
"symfony/event-dispatcher": "^6.4 || ^7.1",
3636
"symfony/form": "^6.4 || ^7.1",
37+
"symfony/framework-bundle": "^6.4 || ^7.1",
3738
"symfony/http-foundation": "^6.4 || ^7.1",
3839
"symfony/http-kernel": "^6.4 || ^7.1",
3940
"symfony/property-access": "^6.4 || ^7.1",

src/Component/src/Metadata/Resource/Factory/AttributesResourceClassListFactory.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ public function __construct(
3838
*/
3939
public function create(): ResourceClassList
4040
{
41-
/** @var class-string[] $classes */
4241
$classes = [];
4342

4443
if ($this->decorated) {

src/Component/src/Symfony/Routing/Factory/AttributesOperationRouteFactory.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,14 @@
1919
use Sylius\Resource\Metadata\RegistryInterface;
2020
use Sylius\Resource\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
2121
use Sylius\Resource\Metadata\ResourceMetadata;
22+
use Sylius\Resource\Symfony\Routing\Factory\Resource\ResourceRouteCollectionFactory;
2223
use Symfony\Component\Routing\Route;
2324
use Symfony\Component\Routing\RouteCollection;
2425
use Webmozart\Assert\Assert;
2526

27+
/**
28+
* @deprecated use ResourceRouteCollectionFactory instead
29+
*/
2630
final class AttributesOperationRouteFactory implements AttributesOperationRouteFactoryInterface
2731
{
2832
public function __construct(

src/Component/src/Symfony/Routing/Factory/AttributesOperationRouteFactoryInterface.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,14 @@
1313

1414
namespace Sylius\Resource\Symfony\Routing\Factory;
1515

16+
use Sylius\Resource\Symfony\Routing\Factory\Resource\ResourceRouteCollectionFactoryInterface;
1617
use Symfony\Component\Routing\RouteCollection;
1718

19+
trigger_deprecation('sylius/resource', '1.13', '"%s" is deprecated, use "%s" instead.', AttributesOperationRouteFactoryInterface::class, ResourceRouteCollectionFactoryInterface::class);
20+
21+
/**
22+
* @deprecated
23+
*/
1824
interface AttributesOperationRouteFactoryInterface
1925
{
2026
/** @psalm-param class-string $className */
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
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\Resource\Symfony\Routing\Factory\Resource;
15+
16+
use Sylius\Resource\Metadata\HttpOperation;
17+
use Sylius\Resource\Metadata\MetadataInterface;
18+
use Sylius\Resource\Metadata\Operations;
19+
use Sylius\Resource\Metadata\RegistryInterface;
20+
use Sylius\Resource\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
21+
use Sylius\Resource\Metadata\ResourceMetadata;
22+
use Sylius\Resource\Symfony\Routing\Factory\OperationRouteFactoryInterface;
23+
use Symfony\Component\Routing\Route;
24+
use Symfony\Component\Routing\RouteCollection;
25+
use Webmozart\Assert\Assert;
26+
27+
/**
28+
* @experimental
29+
*/
30+
final class ResourceRouteCollectionFactory implements ResourceRouteCollectionFactoryInterface
31+
{
32+
public function __construct(
33+
private OperationRouteFactoryInterface $operationRouteFactory,
34+
private ResourceMetadataCollectionFactoryInterface $resourceMetadataFactory,
35+
private RegistryInterface $resourceRegistry,
36+
) {
37+
}
38+
39+
public function createRouteCollectionForClass(string $className): RouteCollection
40+
{
41+
$routeCollection = new RouteCollection();
42+
$resourceMetadata = $this->resourceMetadataFactory->create($className);
43+
44+
/** @var ResourceMetadata $resource */
45+
foreach ($resourceMetadata->getIterator() as $resource) {
46+
$this->createRoutesForResource($routeCollection, $resource);
47+
}
48+
49+
return $routeCollection;
50+
}
51+
52+
private function createRoutesForResource(RouteCollection $routeCollection, ResourceMetadata $resource): void
53+
{
54+
foreach ($resource->getOperations() ?? new Operations() as $operation) {
55+
if (!$operation instanceof HttpOperation) {
56+
continue;
57+
}
58+
59+
$this->addRouteForOperation($routeCollection, $resource, $operation);
60+
}
61+
}
62+
63+
private function addRouteForOperation(RouteCollection $routeCollection, ResourceMetadata $resource, HttpOperation $operation): void
64+
{
65+
$metadata = $this->resourceRegistry->get($resource->getAlias() ?? '');
66+
$routeName = $operation->getRouteName();
67+
68+
Assert::notNull($routeName, sprintf('Operation %s has no route name. Please define one.', $operation::class));
69+
70+
$route = $this->createRoute($metadata, $resource, $operation);
71+
$routeCollection->add($routeName, $route);
72+
}
73+
74+
private function createRoute(MetadataInterface $metadata, ResourceMetadata $resource, HttpOperation $operation): Route
75+
{
76+
return $this->operationRouteFactory->create($metadata, $resource, $operation);
77+
}
78+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
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\Resource\Symfony\Routing\Factory\Resource;
15+
16+
use Symfony\Component\Routing\RouteCollection;
17+
18+
/**
19+
* @experimental
20+
*/
21+
interface ResourceRouteCollectionFactoryInterface
22+
{
23+
/** @psalm-param class-string $className */
24+
public function createRouteCollectionForClass(string $className): RouteCollection;
25+
}

0 commit comments

Comments
 (0)