Skip to content

Commit 8ba8b9f

Browse files
committed
wip
1 parent 9233c4e commit 8ba8b9f

17 files changed

+207
-90
lines changed

src/Bundle/DependencyInjection/SyliusResourceExtension.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
use Sylius\Bundle\ResourceBundle\Form\Type\DefaultResourceType;
2222
use Sylius\Bundle\ResourceBundle\SyliusResourceBundle;
2323
use Sylius\Component\Resource\Factory\FactoryInterface as LegacyFactoryInterface;
24+
use Sylius\Resource\Annotation\AsExpressionProvider;
25+
use Sylius\Resource\Annotation\AsExpressionVariables;
2426
use Sylius\Resource\Factory\Factory;
2527
use Sylius\Resource\Factory\FactoryInterface;
2628
use Sylius\Resource\Metadata\AsResource;
@@ -33,6 +35,7 @@
3335
use Sylius\Resource\Twig\Context\Factory\ContextFactoryInterface;
3436
use Symfony\Component\Config\FileLocator;
3537
use Symfony\Component\Config\Loader\LoaderInterface;
38+
use Symfony\Component\DependencyInjection\ChildDefinition;
3639
use Symfony\Component\DependencyInjection\ContainerBuilder;
3740
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
3841
use Symfony\Component\DependencyInjection\Extension\Extension;
@@ -100,6 +103,20 @@ public function load(array $configs, ContainerBuilder $container): void
100103
$container->addObjectResource(DoctrineORMDriver::class);
101104
$container->addObjectResource(DoctrineODMDriver::class);
102105
$container->addObjectResource(DoctrinePHPCRDriver::class);
106+
107+
$container->registerAttributeForAutoconfiguration(
108+
AsExpressionVariables::class,
109+
static function (ChildDefinition $definition, AsExpressionVariables $attribute, \Reflector $reflector): void {
110+
$definition->addTag(sprintf(AsExpressionVariables::BASE_SERVICE_TAG, $attribute->name));
111+
},
112+
);
113+
114+
$container->registerAttributeForAutoconfiguration(
115+
AsExpressionProvider::class,
116+
static function (ChildDefinition $definition, AsExpressionProvider $attribute, \Reflector $reflector): void {
117+
$definition->addTag(sprintf(AsExpressionProvider::BASE_SERVICE_TAG, $attribute->name));
118+
},
119+
);
103120
}
104121

105122
public function getConfiguration(array $config, ContainerBuilder $container): Configuration

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

Lines changed: 53 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -13,48 +13,77 @@
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">
1515
<services>
16-
<service id="sylius.resource_factory.expression_language" class="Symfony\Component\ExpressionLanguage\ExpressionLanguage" />
17-
<service id="sylius.repository.expression_language" class="Symfony\Component\ExpressionLanguage\ExpressionLanguage" />
18-
<service id="sylius.routing.expression_language" class="Symfony\Component\ExpressionLanguage\ExpressionLanguage" />
16+
<service id="sylius.resource_factory.expression_language_factory" class="Sylius\Resource\Symfony\ExpressionLanguage\ExpressionLanguageFactory">
17+
<argument type="tagged_iterator" tag="sylius.resource_factory.expression_language.provider" />
18+
</service>
1919

20-
<service id="sylius.expression_language.variables.token" class="Sylius\Resource\Symfony\ExpressionLanguage\TokenVariables">
21-
<argument type="service" id="security.token_storage" on-invalid="null" />
22-
<tag name="sylius.resource_factory_variables" />
23-
<tag name="sylius.repository_variables" />
20+
<service id="sylius.resource_factory.expression_language" class="Symfony\Component\ExpressionLanguage\ExpressionLanguage">
21+
<factory service="sylius.resource_factory.expression_language_factory" />
2422
</service>
2523

26-
<service id="sylius.expression_language.variables.request" class="Sylius\Resource\Symfony\ExpressionLanguage\RequestVariables">
27-
<argument type="service" id="request_stack" />
28-
<tag name="sylius.resource_factory_variables" />
29-
<tag name="sylius.repository_variables" />
30-
<tag name="sylius.routing_variables" />
24+
<service id="sylius.repository.expression_language_factory" class="Sylius\Resource\Symfony\ExpressionLanguage\ExpressionLanguageFactory">
25+
<argument type="tagged_iterator" tag="sylius.repository.expression_language.provider" />
3126
</service>
3227

33-
<service id="sylius.expression_language.variables_collection.factory" class="Sylius\Resource\Symfony\ExpressionLanguage\VariablesCollection">
34-
<argument type="tagged_iterator" tag="sylius.resource_factory_variables" />
28+
<service id="sylius.repository.expression_language" class="Symfony\Component\ExpressionLanguage\ExpressionLanguage">
29+
<factory service="sylius.repository.expression_language_factory" />
3530
</service>
3631

37-
<service id="sylius.expression_language.variables_collection.repository" class="Sylius\Resource\Symfony\ExpressionLanguage\VariablesCollection">
38-
<argument type="tagged_iterator" tag="sylius.repository_variables" />
32+
<service id="sylius.routing.expression_language" class="Sylius\Resource\Symfony\ExpressionLanguage\ExpressionLanguageFactory">
33+
<argument type="tagged_iterator" tag="sylius.routing.expression_language.provider" />
3934
</service>
4035

41-
<service id="sylius.expression_language.variables_collection.routing" class="Sylius\Resource\Symfony\ExpressionLanguage\VariablesCollection">
42-
<argument type="tagged_iterator" tag="sylius.routing_variables" />
36+
<service id="sylius.routing.expression_language" class="Symfony\Component\ExpressionLanguage\ExpressionLanguage">
37+
<factory service="sylius.routing.expression_language_factory" />
4338
</service>
4439

45-
<service id="sylius.expression_language.argument_parser.factory" class="Sylius\Resource\Symfony\ExpressionLanguage\ArgumentParser">
40+
41+
42+
<service id="sylius.resource_factory.expression_evaluator" class="Sylius\Resource\Symfony\ExpressionLanguage\ExpressionEvaluator">
4643
<argument type="service" id="sylius.resource_factory.expression_language" />
47-
<argument type="service" id="sylius.expression_language.variables_collection.factory" />
44+
<argument type="service" id="sylius.resource_factory.variables_collection_aggregate" />
4845
</service>
4946

50-
<service id="sylius.expression_language.argument_parser.repository" class="Sylius\Resource\Symfony\ExpressionLanguage\ArgumentParser">
47+
<service id="sylius.repository.expression_evaluator" class="Sylius\Resource\Symfony\ExpressionLanguage\ExpressionEvaluator">
5148
<argument type="service" id="sylius.repository.expression_language" />
52-
<argument type="service" id="sylius.expression_language.variables_collection.repository" />
49+
<argument type="service" id="sylius.repository.variables_collection_aggregate" />
5350
</service>
5451

55-
<service id="sylius.expression_language.argument_parser.routing" class="Sylius\Resource\Symfony\ExpressionLanguage\ArgumentParser">
52+
<service id="sylius.routing.expression_evaluator" class="Sylius\Resource\Symfony\ExpressionLanguage\ExpressionEvaluator">
5653
<argument type="service" id="sylius.routing.expression_language" />
57-
<argument type="service" id="sylius.expression_language.variables_collection.routing" />
54+
<argument type="service" id="sylius.routing.variables_collection_aggregate" />
55+
</service>
56+
57+
58+
59+
60+
<service id="sylius.resource_factory.variables_collection_aggregate" class="Sylius\Resource\Symfony\ExpressionLanguage\VariablesCollectionAggregate">
61+
<argument type="tagged_iterator" tag="sylius.resource_factory_variables" />
62+
</service>
63+
64+
<service id="sylius.repository.variables_collection_aggregate" class="Sylius\Resource\Symfony\ExpressionLanguage\VariablesCollectionAggregate">
65+
<argument type="tagged_iterator" tag="sylius.repository_variables" />
66+
</service>
67+
68+
<service id="sylius.routing.variables_collection_aggregate" class="Sylius\Resource\Symfony\ExpressionLanguage\VariablesCollectionAggregate">
69+
<argument type="tagged_iterator" tag="sylius.routing_variables" />
70+
</service>
71+
72+
73+
74+
75+
76+
<service id="sylius.expression_language.variables.token" class="Sylius\Resource\Symfony\ExpressionLanguage\TokenVariables">
77+
<argument type="service" id="security.token_storage" on-invalid="null" />
78+
<tag name="sylius.resource_factory_variables" />
79+
<tag name="sylius.repository_variables" />
80+
</service>
81+
82+
<service id="sylius.expression_language.variables.request" class="Sylius\Resource\Symfony\ExpressionLanguage\RequestVariables">
83+
<argument type="service" id="request_stack" />
84+
<tag name="sylius.resource_factory_variables" />
85+
<tag name="sylius.repository_variables" />
86+
<tag name="sylius.routing_variables" />
5887
</service>
5988
</services>
6089
</container>

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@
113113

114114
<service id="sylius.routing.redirect_handler" class="Sylius\Resource\Symfony\Routing\RedirectHandler">
115115
<argument type="service" id="router" />
116-
<argument type="service" id="sylius.expression_language.argument_parser.routing" />
116+
<argument type="service" id="sylius.routing.expression_evaluator" />
117117
<argument type="service" id="sylius.routing.factory.operation_route_name_factory" />
118118
</service>
119119
<service id="Sylius\Resource\Symfony\Routing\RedirectHandlerInterface" alias="sylius.routing.redirect_handler" />

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@
4040
<service id="Sylius\Resource\Symfony\Request\State\Provider">
4141
<argument type="tagged_locator" tag="sylius.repository" />
4242
<argument type="service" id="sylius.repository_argument_resolver.request" />
43-
<argument type="service" id="sylius.expression_language.argument_parser.repository" />
43+
<argument type="service" id="sylius.repository.expression_evaluator" />
4444
<tag name="sylius.state_provider" />
4545
</service>
4646

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\Annotation;
15+
16+
#[\Attribute(\Attribute::TARGET_CLASS)]
17+
final readonly class AsExpressionProvider
18+
{
19+
public const BASE_SERVICE_TAG = 'sylius.%s.expression_language.provider';
20+
21+
public function __construct(
22+
public string $name,
23+
) {
24+
}
25+
}

src/Component/src/Symfony/ExpressionLanguage/VariablesInterface.php renamed to src/Component/src/Annotation/AsExpressionVariables.php

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,15 @@
1111

1212
declare(strict_types=1);
1313

14-
namespace Sylius\Resource\Symfony\ExpressionLanguage;
14+
namespace Sylius\Resource\Annotation;
1515

16-
/**
17-
* @experimental
18-
*/
19-
interface VariablesInterface
16+
#[\Attribute(\Attribute::TARGET_CLASS)]
17+
final class AsExpressionVariables
2018
{
21-
public function getVariables(): array;
19+
public const BASE_SERVICE_TAG = 'sylius.%s_variables';
20+
21+
public function __construct(
22+
public string $name,
23+
) {
24+
}
2225
}

src/Component/src/State/Factory.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
use Sylius\Resource\Factory\FactoryInterface as ResourceFactoryInterface;
1919
use Sylius\Resource\Metadata\FactoryAwareOperationInterface;
2020
use Sylius\Resource\Metadata\Operation;
21-
use Sylius\Resource\Symfony\ExpressionLanguage\ArgumentParserInterface;
21+
use Sylius\Resource\Symfony\ExpressionLanguage\ExpressionEvaluatorInterface;
2222
use Webmozart\Assert\Assert;
2323

2424
/**
@@ -28,7 +28,7 @@ final class Factory implements FactoryInterface
2828
{
2929
public function __construct(
3030
private ContainerInterface $locator,
31-
private ArgumentParserInterface $argumentParser,
31+
private ExpressionEvaluatorInterface $expressionEvaluator,
3232
) {
3333
}
3434

@@ -69,7 +69,7 @@ public function create(Operation $operation, Context $context): ?object
6969
private function parseArgumentValues(array $arguments): array
7070
{
7171
foreach ($arguments as $key => $value) {
72-
$arguments[$key] = $this->argumentParser->parseExpression($value);
72+
$arguments[$key] = $this->expressionEvaluator->evaluateExpression($value);
7373
}
7474

7575
return $arguments;

src/Component/src/Symfony/ExpressionLanguage/ArgumentParser.php renamed to src/Component/src/Symfony/ExpressionLanguage/ExpressionEvaluator.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,20 @@
1818
/**
1919
* @experimental
2020
*/
21-
final class ArgumentParser implements ArgumentParserInterface
21+
final class ExpressionEvaluator implements ExpressionEvaluatorInterface
2222
{
2323
public function __construct(
2424
private ExpressionLanguage $expressionLanguage,
2525
private VariablesCollectionInterface $variablesCollection,
2626
) {
2727
}
2828

29-
public function parseExpression(string $expression, array $variables = []): mixed
29+
public function evaluateExpression(string $expression, array $variables = []): mixed
3030
{
3131
return $this->expressionLanguage->evaluate(
3232
$expression,
3333
array_merge(
34-
$this->variablesCollection->getVariables(),
34+
$this->variablesCollection->getCollection(),
3535
$variables,
3636
),
3737
);

src/Component/src/Symfony/ExpressionLanguage/ArgumentParserInterface.php renamed to src/Component/src/Symfony/ExpressionLanguage/ExpressionEvaluatorInterface.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
/**
1717
* @experimental
1818
*/
19-
interface ArgumentParserInterface
19+
interface ExpressionEvaluatorInterface
2020
{
21-
public function parseExpression(string $expression, array $variables = []): mixed;
21+
public function evaluateExpression(string $expression, array $variables = []): mixed;
2222
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
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\ExpressionLanguage;
15+
16+
use Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface;
17+
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
18+
use Webmozart\Assert\Assert;
19+
20+
/**
21+
* @experimental
22+
*/
23+
final class ExpressionLanguageFactory
24+
{
25+
/** @param iterable<int, ExpressionFunctionProviderInterface> $providers */
26+
public function __construct(private $providers)
27+
{
28+
Assert::allIsInstanceOf($this->providers, ExpressionFunctionProviderInterface::class);
29+
}
30+
31+
public function __invoke(): ExpressionLanguage
32+
{
33+
$expressionLanguage = new ExpressionLanguage();
34+
35+
foreach ($this->providers as $provider) {
36+
$expressionLanguage->registerProvider($provider);
37+
}
38+
39+
return $expressionLanguage;
40+
}
41+
}

0 commit comments

Comments
 (0)