Skip to content

Commit 69d39f1

Browse files
committed
Add Operation defaults trait
1 parent f346d43 commit 69d39f1

8 files changed

+162
-26
lines changed

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

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,18 @@
2121
<tag name="cache.pool" />
2222
</service>
2323

24-
<service id="sylius.resource_metadata_collection.factory.attributes" class="Sylius\Resource\Metadata\Resource\Factory\AttributesResourceMetadataCollectionFactory">
24+
<service id="sylius.resource_metadata_collection.factory.attributes"
25+
class="Sylius\Resource\Metadata\Resource\Factory\AttributesResourceMetadataCollectionFactory"
26+
>
2527
<argument type="service" id="sylius.resource_registry" />
2628
<argument type="service" id="sylius.routing.factory.operation_route_name_factory" />
2729
</service>
28-
<service id="Sylius\Resource\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface" alias="sylius.resource_metadata_collection.factory.attributes" />
2930
<service id="sylius.resource_metadata_collection.factory" alias="sylius.resource_metadata_collection.factory.attributes" />
31+
<service id="Sylius\Resource\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface" alias="sylius.resource_metadata_collection.factory.attributes" />
3032

3133
<service id="sylius.resource_metadata_collection.factory.state_machine"
3234
class="Sylius\Resource\Metadata\Resource\Factory\StateMachineResourceMetadataCollectionFactory"
33-
decorates="sylius.resource_metadata_collection.factory.attributes"
35+
decorates="sylius.resource_metadata_collection.factory"
3436
decoration-priority="300"
3537
>
3638
<argument type="service" id="sylius.resource_registry" />
@@ -78,15 +80,15 @@
7880

7981
<service id="sylius.resource_metadata_collection.factory.templates_dir"
8082
class="Sylius\Resource\Metadata\Resource\Factory\TemplatesDirResourceMetadataCollectionFactory"
81-
decorates="sylius.resource_metadata_collection.factory.attributes"
83+
decorates="sylius.resource_metadata_collection.factory"
8284
>
8385
<argument type="service" id=".inner" />
8486
<argument>%sylius.resource.settings%</argument>
8587
</service>
8688

8789
<service id="sylius.resource_metadata_collection.factory.cached"
8890
class="Sylius\Resource\Metadata\Resource\Factory\CachedResourceMetadataCollectionFactory"
89-
decorates="sylius.resource_metadata_collection.factory.attributes"
91+
decorates="sylius.resource_metadata_collection.factory"
9092
decoration-priority="-10"
9193
>
9294
<argument type="service" id="sylius.cache.metadata.resource_collection" />

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@
106106
<service id="sylius.routing.factory.attributes_operation_route" class="Sylius\Resource\Symfony\Routing\Factory\AttributesOperationRouteFactory" public="false">
107107
<argument type="service" id="sylius.resource_registry" />
108108
<argument type="service" id="sylius.routing.factory.operation_route" />
109-
<argument type="service" id="sylius.resource_metadata_collection.factory.attributes" />
109+
<argument type="service" id="sylius.resource_metadata_collection.factory" />
110110
</service>
111111
<service id="Sylius\Resource\Symfony\Routing\Factory\AttributesOperationRouteFactoryInterface" alias="sylius.routing.factory.attributes_operation_route" />
112112

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ public function __construct(
2929

3030
public function create(string $resourceClass): ResourceMetadataCollection
3131
{
32-
$resourceCollectionMetadata = $this->decorated->create($resourceClass);
32+
$resourceMetadataCollection = $this->decorated->create($resourceClass);
3333

3434
/** @var ResourceMetadata $resource */
35-
foreach ($resourceCollectionMetadata->getIterator() as $i => $resource) {
35+
foreach ($resourceMetadataCollection->getIterator() as $i => $resource) {
3636
$operations = $resource->getOperations() ?? new Operations();
3737

3838
/** @var Operation $operation */
@@ -45,10 +45,10 @@ public function create(string $resourceClass): ResourceMetadataCollection
4545

4646
$resource = $resource->withOperations($operations);
4747

48-
$resourceCollectionMetadata[$i] = $resource;
48+
$resourceMetadataCollection[$i] = $resource;
4949
}
5050

51-
return $resourceCollectionMetadata;
51+
return $resourceMetadataCollection;
5252
}
5353

5454
private function addDefaults(ResourceMetadata $resource, Operation $operation): Operation

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,10 @@ public function __construct(
3131

3232
public function create(string $resourceClass): ResourceMetadataCollection
3333
{
34-
$resourceCollectionMetadata = $this->decorated->create($resourceClass);
34+
$resourceMetadataCollection = $this->decorated->create($resourceClass);
3535

3636
/** @var ResourceMetadata $resource */
37-
foreach ($resourceCollectionMetadata->getIterator() as $i => $resource) {
37+
foreach ($resourceMetadataCollection->getIterator() as $i => $resource) {
3838
$resourceConfiguration = $this->resourceRegistry->get($resource->getAlias() ?? '');
3939
$operations = $resource->getOperations() ?? new Operations();
4040

@@ -55,10 +55,10 @@ public function create(string $resourceClass): ResourceMetadataCollection
5555

5656
$resource = $resource->withOperations($operations);
5757

58-
$resourceCollectionMetadata[$i] = $resource;
58+
$resourceMetadataCollection[$i] = $resource;
5959
}
6060

61-
return $resourceCollectionMetadata;
61+
return $resourceMetadataCollection;
6262
}
6363

6464
private function addDefaults(MetadataInterface $resourceConfiguration, ResourceMetadata $resource, FactoryAwareOperationInterface $operation): FactoryAwareOperationInterface
Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
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\Metadata\Resource\Factory;
15+
16+
use Sylius\Resource\Metadata\HttpOperation;
17+
use Sylius\Resource\Metadata\MetadataInterface;
18+
use Sylius\Resource\Metadata\Operation;
19+
use Sylius\Resource\Metadata\RegistryInterface;
20+
use Sylius\Resource\Metadata\ResourceMetadata;
21+
use Sylius\Resource\Symfony\Request\State\Responder;
22+
use Sylius\Resource\Symfony\Routing\Factory\RouteName\OperationRouteNameFactory;
23+
24+
/**
25+
* @internal
26+
*/
27+
trait OperationDefaultsTrait
28+
{
29+
/**
30+
* @param class-string $resourceClass
31+
*/
32+
private function getResourceWithDefaults(string $resourceClass, ResourceMetadata $resource, MetadataInterface $resourceConfiguration): ResourceMetadata
33+
{
34+
$resource = $resource->withClass($resourceClass);
35+
36+
if (null === $resource->getAlias()) {
37+
$resource = $resource->withAlias($resourceConfiguration->getAlias());
38+
}
39+
40+
if (null === $resource->getApplicationName()) {
41+
$resource = $resource->withApplicationName($resourceConfiguration->getApplicationName());
42+
}
43+
44+
if (null === $resource->getName()) {
45+
$resource = $resource->withName($resourceConfiguration->getName());
46+
}
47+
48+
return $resource;
49+
}
50+
51+
private function getOperationWithDefaults(OperationRouteNameFactory $operationRouteNameFactory, RegistryInterface $resourceRegistry, ResourceMetadata $resource, Operation $operation): array
52+
{
53+
$resourceConfiguration = $resourceRegistry->get($resource->getAlias() ?? '');
54+
55+
$operation = $operation->withResource($resource);
56+
57+
if (null === $resource->getName()) {
58+
$resourceName = $resourceConfiguration->getName();
59+
60+
$resource = $resource->withName($resourceName);
61+
$operation = $operation->withResource($resource);
62+
}
63+
64+
if (null === $resource->getPluralName()) {
65+
$resourcePluralName = $resourceConfiguration->getPluralName();
66+
67+
$resource = $resource->withPluralName($resourcePluralName);
68+
$operation = $operation->withResource($resource);
69+
}
70+
71+
if (null === $operation->getNormalizationContext()) {
72+
$operation = $operation->withNormalizationContext($resource->getNormalizationContext());
73+
}
74+
75+
if (null === $operation->getDenormalizationContext()) {
76+
$operation = $operation->withDenormalizationContext($resource->getDenormalizationContext());
77+
}
78+
79+
if (null === $operation->getValidationContext()) {
80+
$operation = $operation->withValidationContext($resource->getValidationContext());
81+
}
82+
83+
$operation = $operation->withResource($resource);
84+
85+
if (null === $operation->getFormType()) {
86+
$formType = $resource->getFormType() ?? $resourceConfiguration->getClass('form');
87+
$operation = $operation->withFormType($formType);
88+
}
89+
90+
$formOptions = $this->buildFormOptions($operation, $resourceConfiguration);
91+
$operation = $operation->withFormOptions($formOptions);
92+
93+
if ($operation instanceof HttpOperation) {
94+
if (null === $operation->getRoutePrefix()) {
95+
$operation = $operation->withRoutePrefix($resource->getRoutePrefix() ?? null);
96+
}
97+
98+
if (null === $operation->getTwigContextFactory()) {
99+
$operation = $operation->withTwigContextFactory('sylius.twig.context.factory.default');
100+
}
101+
102+
if (null === $routeName = $operation->getRouteName()) {
103+
$routeName = $operationRouteNameFactory->createRouteName($operation);
104+
$operation = $operation->withRouteName($routeName);
105+
}
106+
107+
if (null === $operation->getResponder()) {
108+
$operation = $operation->withResponder(Responder::class);
109+
}
110+
111+
$operation = $operation->withName($routeName);
112+
}
113+
114+
$operationName = $operation->getName();
115+
116+
return [$operationName, $operation];
117+
}
118+
119+
private function buildFormOptions(Operation $operation, MetadataInterface $resourceConfiguration): array
120+
{
121+
$formOptions = array_merge(
122+
['data_class' => $resourceConfiguration->getClass('model')],
123+
$operation->getFormOptions() ?? [],
124+
);
125+
126+
$validationGroups = $operation->getValidationContext()['groups'] ?? null;
127+
128+
if (null !== $validationGroups) {
129+
$formOptions = array_merge(['validation_groups' => $validationGroups], $formOptions);
130+
}
131+
132+
return $formOptions;
133+
}
134+
}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ public function __construct(
2929

3030
public function create(string $resourceClass): ResourceMetadataCollection
3131
{
32-
$resourceCollectionMetadata = $this->decorated->create($resourceClass);
32+
$resourceMetadataCollection = $this->decorated->create($resourceClass);
3333

3434
/** @var ResourceMetadata $resource */
35-
foreach ($resourceCollectionMetadata->getIterator() as $i => $resource) {
35+
foreach ($resourceMetadataCollection->getIterator() as $i => $resource) {
3636
$operations = $resource->getOperations() ?? new Operations();
3737

3838
/** @var Operation $operation */
@@ -45,10 +45,10 @@ public function create(string $resourceClass): ResourceMetadataCollection
4545

4646
$resource = $resource->withOperations($operations);
4747

48-
$resourceCollectionMetadata[$i] = $resource;
48+
$resourceMetadataCollection[$i] = $resource;
4949
}
5050

51-
return $resourceCollectionMetadata;
51+
return $resourceMetadataCollection;
5252
}
5353

5454
private function addDefaults(Operation $operation): Operation

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ public function __construct(
3333

3434
public function create(string $resourceClass): ResourceMetadataCollection
3535
{
36-
$resourceCollectionMetadata = $this->decorated->create($resourceClass);
36+
$resourceMetadataCollection = $this->decorated->create($resourceClass);
3737

3838
/** @var ResourceMetadata $resource */
39-
foreach ($resourceCollectionMetadata->getIterator() as $i => $resource) {
39+
foreach ($resourceMetadataCollection->getIterator() as $i => $resource) {
4040
$resourceConfiguration = $this->resourceRegistry->get($resource->getAlias() ?? '');
4141
$operations = $resource->getOperations() ?? new Operations();
4242

@@ -50,10 +50,10 @@ public function create(string $resourceClass): ResourceMetadataCollection
5050

5151
$resource = $resource->withOperations($operations);
5252

53-
$resourceCollectionMetadata[$i] = $resource;
53+
$resourceMetadataCollection[$i] = $resource;
5454
}
5555

56-
return $resourceCollectionMetadata;
56+
return $resourceMetadataCollection;
5757
}
5858

5959
private function addDefaults(MetadataInterface $resourceConfiguration, Operation $operation): Operation

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ public function __construct(
2828

2929
public function create(string $resourceClass): ResourceMetadataCollection
3030
{
31-
$resourceCollectionMetadata = $this->decorated->create($resourceClass);
31+
$resourceMetadataCollection = $this->decorated->create($resourceClass);
3232

3333
/** @var ResourceMetadata $resource */
34-
foreach ($resourceCollectionMetadata->getIterator() as $i => $resource) {
34+
foreach ($resourceMetadataCollection->getIterator() as $i => $resource) {
3535
$operations = $resource->getOperations() ?? new Operations();
3636

3737
/** @var Operation $operation */
@@ -44,10 +44,10 @@ public function create(string $resourceClass): ResourceMetadataCollection
4444

4545
$resource = $resource->withOperations($operations);
4646

47-
$resourceCollectionMetadata[$i] = $resource;
47+
$resourceMetadataCollection[$i] = $resource;
4848
}
4949

50-
return $resourceCollectionMetadata;
50+
return $resourceMetadataCollection;
5151
}
5252

5353
private function addDefaults(ResourceMetadata $resource, Operation $operation): Operation

0 commit comments

Comments
 (0)