Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
4bd335c
Use locale from kernel default locale
loic425 Jun 11, 2025
2424c56
Use locale from kernel default locale (#1034)
NoResponseMate Jun 11, 2025
46eae36
Add PHP file resource extractor
loic425 Mar 14, 2025
a9474b5
Fix extractor with multiple files
loic425 Jun 3, 2025
de079e6
Tag new resource extractor as experimental
loic425 Jun 4, 2025
53bc68d
Add imports in the config
loic425 Jun 4, 2025
42acb13
Configure the php file resource extractor
loic425 Jun 4, 2025
a9a92e8
[Metadata] Add Php file resource class list factory
loic425 Jun 6, 2025
0fc9795
Add PHP file resource metadata collection factory
loic425 Jun 6, 2025
9f1ae8c
Apply suggestions from code review
loic425 Jun 11, 2025
a9f6c61
Revert skeleton changes
loic425 Jun 17, 2025
8dc64d4
Add tests for external routing files
loic425 Jun 17, 2025
4bd4943
Add tests for external routing files (#1036)
loic425 Jun 17, 2025
8b6e73a
External routing files (#1035)
NoResponseMate Jun 17, 2025
57a1ba3
Add repository variables for factory
loic425 Jun 18, 2025
e82558a
Add upmerge from 1.13
loic425 Jun 19, 2025
9dcd596
Add upmerge from 1.13 (#1040)
NoResponseMate Jun 23, 2025
25e82a0
Update matthiasnoback/symfony-dependency-injection-test requirement f…
dependabot[bot] Jun 24, 2025
a84ddd6
Fix configured resource without form
loic425 Jun 18, 2025
1cf5c1e
Add providers on argument parsers
loic425 Jun 20, 2025
25553ce
Add repository variables for factory (#1038)
NoResponseMate Jun 26, 2025
28452f3
Fix configured resource without form (#1039)
NoResponseMate Jun 26, 2025
8598542
[ExpressionLanguage] Add providers on argument parsers (#1041)
NoResponseMate Jun 26, 2025
93dae9a
Update matthiasnoback/symfony-dependency-injection-test requirement f…
NoResponseMate Jun 26, 2025
56973cf
[UPMERGE] 1.13 -> 1.14 (#1042)
NoResponseMate Jun 26, 2025
4e7bcd2
Add argument parser for resource and operation vars
loic425 Jun 25, 2025
8a6d9fa
Add German translation
alexanderbuerner Jun 28, 2025
471aaa4
Add German translation
alexanderbuerner Jun 28, 2025
d82dd44
Add German translation (#1044)
mamazu Jun 28, 2025
8f21e28
Apply suggestions from code review
loic425 Jun 30, 2025
09c01b4
Add argument parser for resource and operation vars (#1043)
NoResponseMate Jun 30, 2025
2c3adea
[UPMERGE] 1.13 -> 1.14 (#1046)
NoResponseMate Jul 1, 2025
9ff7b87
Add filters from grid storage on redirect handler
loic425 Jul 2, 2025
6e74dde
Add filters from grid storage on redirect handler (#1047)
NoResponseMate Jul 4, 2025
9e9e8fa
Add condition option on legacy routing
loic425 Jul 7, 2025
5fa87cd
Add condition option on legacy routing (#1048)
NoResponseMate Jul 7, 2025
c4c5dd5
Add route condition on new routing system
loic425 Jul 8, 2025
cbc846c
Add route condition on new routing system (#1050)
NoResponseMate Jul 10, 2025
0599c55
Add new route paths and by layer to keep olding paths
loic425 Jul 10, 2025
bb48db7
Add error handling on write processor
loic425 Jul 10, 2025
9963374
Align new route paths and add a bc layer to keep legacy paths (#1051)
NoResponseMate Jul 15, 2025
6bf5526
Apply suggestions from code review.
loic425 Jul 15, 2025
9ab125b
Add error handling on write processor (#1049)
NoResponseMate Jul 15, 2025
d75efd9
Recursive array argument handling on redirect parameters
loic425 Jul 28, 2025
3a0f21b
Recursive array argument handling on redirect parameters (#1054)
NoResponseMate Jul 29, 2025
78af13b
[Fix] Do not dispatch a post write event when data is already a response
loic425 Jul 31, 2025
af31ef1
[Fix] Do not dispatch a post write event when data is already a respo…
NoResponseMate Jul 31, 2025
f334e21
Resource discovery: ignore comments/strings when detecting classes
dario-dib Sep 11, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,7 @@ jobs:
-
name: Create-project with skeleton
run: |
set -x
composer create-project --ansi "symfony/skeleton:${{ matrix.skeleton }}" skeleton_app
cd skeleton_app
composer config extra.symfony.allow-contrib true
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/upmerge_pr.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ jobs:
matrix:
include:
-
base_branch: "1.12"
target_branch: "1.13"
base_branch: "1.13"
target_branch: "1.14"

steps:
-
Expand Down
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
"friendsofsymfony/rest-bundle": "^3.7",
"jms/serializer-bundle": "^3.5 || ^4.0 || ^5.0",
"lchrusciel/api-test-case": "^5.0",
"matthiasnoback/symfony-dependency-injection-test": "^4.2.1 || ^5.1",
"matthiasnoback/symfony-dependency-injection-test": "^6.1.0",
"pagerfanta/pagerfanta": "^4.4",
"pamil/phpspec-skip-example-extension": "^4.2",
"phpspec/phpspec": "^7.5",
Expand Down
1 change: 1 addition & 0 deletions phpstan.neon
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@ parameters:
- '/Method Sylius\\Bundle\\ResourceBundle\\Event\\ResourceControllerEvent::stop\(\) has no return typehint specified./'
- '/Method Sylius\\Bundle\\ResourceBundle\\Form\\Extension\\HttpFoundation\\HttpFoundationRequestHandler::handleRequest\(\) has no return typehint specified./'
- '/Method Sylius\\Bundle\\ResourceBundle\\Grid\\Controller\\ResourcesResolver::getResources\(\) has no return typehint specified./'
- '/Method Sylius\\Resource\\Metadata\\Extractor\\AbstractResourceExtractor::getResources\(\) should return array<Sylius\\Resource\\Metadata\\ResourceMetadata> but returns array<Sylius\\Resource\\Metadata\\ResourceMetadata>\|null./'
- '/Method Sylius\\Resource\\Model\\ResourceInterface::getId\(\) has no return typehint specified./'
- '/Method Sylius\\Resource\\Model\\TimestampableInterface::setCreatedAt\(\) has no return typehint specified./'
- '/Method Sylius\\Resource\\Model\\TimestampableInterface::setUpdatedAt\(\) has no return typehint specified./'
Expand Down
14 changes: 14 additions & 0 deletions psalm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@
<InvalidReturnType>
<errorLevel type="suppress">
<file name="src/Component/src/Doctrine/Persistence/InMemoryRepository.php" />
<file name="src/Component/src/Metadata/Extractor/PhpFileResourceExtractor.php" />
</errorLevel>
</InvalidReturnType>

Expand Down Expand Up @@ -173,6 +174,12 @@
</errorLevel>
</MoreSpecificImplementedParamType>

<NullableReturnStatement>
<errorLevel type="suppress">
<file name="src/Component/src/Metadata/Extractor/PhpFileResourceExtractor.php" />
</errorLevel>
</NullableReturnStatement>

<NullArgument>
<errorLevel type="suppress">
<directory name="src" />
Expand All @@ -188,6 +195,7 @@
<PossiblyNullArgument>
<errorLevel type="suppress">
<file name="src/Bundle/Grid/Parser/OptionsParser.php" />
<file name="src/Component/src/Metadata/Operation/HttpOperationInitiator.php" />
</errorLevel>
</PossiblyNullArgument>

Expand Down Expand Up @@ -321,6 +329,12 @@
</errorLevel>
</UnrecognizedStatement>

<UnresolvableInclude>
<errorLevel type="suppress">
<file name="src/Component/src/Metadata/Extractor/PhpFileResourceExtractor.php" />
</errorLevel>
</UnresolvableInclude>

<UnsupportedReferenceUsage>
<errorLevel type="suppress">
<file name="src/Component/src/Doctrine/Persistence/InMemoryRepository.php" />
Expand Down
23 changes: 23 additions & 0 deletions src/Bundle/Context/Initiator/LegacyRequestContextInitiator.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
use Sylius\Resource\Context\Initiator\RequestContextInitiatorInterface;
use Sylius\Resource\Context\Option\MetadataOption;
use Sylius\Resource\Metadata\RegistryInterface;
use Sylius\Resource\Symfony\ExpressionLanguage\VarsResolverInterface;
use Symfony\Component\HttpFoundation\Request;

final class LegacyRequestContextInitiator implements RequestContextInitiatorInterface
Expand All @@ -27,7 +28,17 @@ public function __construct(
private RegistryInterface $resourceRegistry,
private RequestConfigurationFactoryInterface $requestConfigurationFactory,
private RequestContextInitiatorInterface $decorated,
private ?VarsResolverInterface $varsResolver = null,
) {
if (null === $varsResolver) {
trigger_deprecation(
'sylius/resource-bundle',
'1.14',
'Not passing an instance of "%s" as the fourth constructor argument for "%s" is deprecated and will not be supported in 2.0.',
VarsResolverInterface::class,
self::class,
);
}
}

public function initializeContext(Request $request): Context
Expand All @@ -49,7 +60,19 @@ public function initializeContext(Request $request): Context
}

$configuration = $this->requestConfigurationFactory->create($metadata, $request);
$configurationVars = $this->resolveVars($configuration->getVars());

$configuration->getParameters()->set('vars', $configurationVars);

return $context->with(new MetadataOption($metadata), new RequestConfigurationOption($configuration));
}

private function resolveVars(array $vars): array
{
if (null === $this->varsResolver) {
return $vars;
}

return $this->varsResolver->resolve($vars);
}
}
6 changes: 6 additions & 0 deletions src/Bundle/DependencyInjection/Configuration.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ public function getConfigTreeBuilder(): TreeBuilder
->arrayNode('mapping')
->addDefaultsIfNotSet()
->children()
->arrayNode('imports')
->prototype('scalar')->end()
->end()
->arrayNode('paths')
->prototype('scalar')->end()
->end()
Expand All @@ -48,6 +51,9 @@ public function getConfigTreeBuilder(): TreeBuilder
->defaultValue('sylius.resource_controller.authorization_checker.disabled')
->cannotBeEmpty()
->end()
->booleanNode('routing_path_bc_layer')
->defaultTrue()
->end()
->end()
;

Expand Down
44 changes: 44 additions & 0 deletions src/Bundle/DependencyInjection/SyliusResourceExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,14 @@
use Sylius\Resource\Twig\Context\Factory\ContextFactoryInterface;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\Config\Resource\DirectoryResource;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Component\DependencyInjection\Extension\Extension;
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
use Symfony\Component\DependencyInjection\Loader\XmlFileLoader;
use Symfony\Component\Finder\Finder;
use function Symfony\Component\String\u;

final class SyliusResourceExtension extends Extension implements PrependExtensionInterface
Expand All @@ -64,8 +67,10 @@ public function load(array $configs, ContainerBuilder $container): void

$container->setParameter('sylius.resource.mapping', $config['mapping']);
$container->setParameter('sylius.resource.settings', $config['settings']);
$container->setParameter('sylius.routing_path_bc_layer', $config['routing_path_bc_layer']);
$container->setAlias('sylius.resource_controller.authorization_checker', $config['authorization_checker']);

$this->registerMetadataConfiguration($container, $config);
$this->autoRegisterResources($config, $container);

$this->loadPersistence($config['drivers'], $config['resources'], $loader, $container);
Expand Down Expand Up @@ -320,4 +325,43 @@ private function loadResources(array $loadedResources, ContainerBuilder $contain
}
}
}

private function registerMetadataConfiguration(ContainerBuilder $container, array $config): void
{
$resources = $this->getResourceFilesToWatch($container, $config);

$container->getDefinition('sylius.metadata.resource_extractor.php_file')->replaceArgument(0, $resources);
}

private function getResourceFilesToWatch(ContainerBuilder $container, array $config): array
{
$files = [];

/** @var string $path */
foreach ($config['mapping']['imports'] ?? [] as $path) {
if (is_dir($path)) {
foreach (Finder::create()->followLinks()->files()->in($path)->name('/\.php$/')->sortByName() as $file) {
$files[] = $file->getRealPath();
}

$container->addResource(new DirectoryResource($path, '/\.php$/'));

continue;
}

if ($container->fileExists($path, false)) {
if (!str_ends_with($path, '.php')) {
throw new RuntimeException(\sprintf('Unsupported mapping type in "%s", supported type is PHP.', $path));
}

$files[] = $path;

continue;
}

throw new RuntimeException(\sprintf('Could not open file or directory "%s".', $path));
}

return $files;
}
}
1 change: 1 addition & 0 deletions src/Bundle/Resources/config/services/context.xml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
<argument type="service" id="sylius.resource_registry" />
<argument type="service" id="sylius.resource_controller.request_configuration_factory" />
<argument type="service" id=".inner" />
<argument type="service" id="sylius.expression_language.vars_resolver.metadata" />
</service>
</services>
</container>
31 changes: 31 additions & 0 deletions src/Bundle/Resources/config/services/expression_language.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,23 +13,36 @@

<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">
<services>
<service id="sylius.metadata.expression_language" class="Symfony\Component\ExpressionLanguage\ExpressionLanguage" />
<service id="sylius.resource_factory.expression_language" class="Symfony\Component\ExpressionLanguage\ExpressionLanguage" />
<service id="sylius.repository.expression_language" class="Symfony\Component\ExpressionLanguage\ExpressionLanguage" />
<service id="sylius.routing.expression_language" class="Symfony\Component\ExpressionLanguage\ExpressionLanguage" />

<service id="sylius.expression_language.variables.token" class="Sylius\Resource\Symfony\ExpressionLanguage\TokenVariables">
<argument type="service" id="security.token_storage" on-invalid="null" />
<tag name="sylius.metadata_variables" />
<tag name="sylius.resource_factory_variables" />
<tag name="sylius.repository_variables" />
</service>

<service id="sylius.expression_language.variables.request" class="Sylius\Resource\Symfony\ExpressionLanguage\RequestVariables">
<argument type="service" id="request_stack" />
<tag name="sylius.metadata_variables" />
<tag name="sylius.resource_factory_variables" />
<tag name="sylius.repository_variables" />
<tag name="sylius.routing_variables" />
</service>

<service id="sylius.expression_language.variables.sylius_repositories" class="Sylius\Resource\Symfony\ExpressionLanguage\SyliusRepositoriesVariables">
<argument type="tagged_locator" tag="sylius.repository" />
<tag name="sylius.metadata_variables" />
<tag name="sylius.resource_factory_variables" />
</service>

<service id="sylius.expression_language.variables_collection.metadata" class="Sylius\Resource\Symfony\ExpressionLanguage\VariablesCollection">
<argument type="tagged_iterator" tag="sylius.metadata_variables" />
</service>

<service id="sylius.expression_language.variables_collection.factory" class="Sylius\Resource\Symfony\ExpressionLanguage\VariablesCollection">
<argument type="tagged_iterator" tag="sylius.resource_factory_variables" />
</service>
Expand All @@ -42,19 +55,37 @@
<argument type="tagged_iterator" tag="sylius.routing_variables" />
</service>

<service id="sylius.expression_language.providers.throw_not_found_on_null" class="Sylius\Resource\Symfony\ExpressionLanguage\Provider\ThrowNotFoundOnNullExpressionFunctionProvider">
<tag name="sylius.metadata_providers" />
<tag name="sylius.resource_factory_providers" />
</service>

<service id="sylius.expression_language.vars_resolver.metadata" class="Sylius\Resource\Symfony\ExpressionLanguage\VarsResolver">
<argument type="service" id="sylius.expression_language.argument_parser.metadata" />
</service>

<service id="sylius.expression_language.argument_parser.metadata" class="Sylius\Resource\Symfony\ExpressionLanguage\ArgumentParser">
<argument type="service" id="sylius.metadata.expression_language" />
<argument type="service" id="sylius.expression_language.variables_collection.metadata" />
<argument type="tagged_iterator" tag="sylius.metadata_providers" />
</service>

<service id="sylius.expression_language.argument_parser.factory" class="Sylius\Resource\Symfony\ExpressionLanguage\ArgumentParser">
<argument type="service" id="sylius.resource_factory.expression_language" />
<argument type="service" id="sylius.expression_language.variables_collection.factory" />
<argument type="tagged_iterator" tag="sylius.resource_factory_providers" />
</service>

<service id="sylius.expression_language.argument_parser.repository" class="Sylius\Resource\Symfony\ExpressionLanguage\ArgumentParser">
<argument type="service" id="sylius.repository.expression_language" />
<argument type="service" id="sylius.expression_language.variables_collection.repository" />
<argument type="tagged_iterator" tag="sylius.repository_providers" />
</service>

<service id="sylius.expression_language.argument_parser.routing" class="Sylius\Resource\Symfony\ExpressionLanguage\ArgumentParser">
<argument type="service" id="sylius.routing.expression_language" />
<argument type="service" id="sylius.expression_language.variables_collection.routing" />
<argument type="tagged_iterator" tag="sylius.routing_providers" />
</service>
</services>
</container>
8 changes: 8 additions & 0 deletions src/Bundle/Resources/config/services/metadata/extractor.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<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">
<services>
<service id="sylius.metadata.resource_extractor.php_file" class="Sylius\Resource\Metadata\Extractor\PhpFileResourceExtractor" public="false">
<argument type="collection" />
<argument type="service" id="service_container" />
</service>
</services>
</container>
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,15 @@
<argument>%sylius.resource.mapping%</argument>
</service>
<service id="Sylius\Resource\Metadata\Resource\Factory\AttributesResourceClassListFactory" alias="sylius.metadata.resource_class_list.factory.attributes" />

<service id="sylius.metadata.resource_class_list.factory.php_file"
class="Sylius\Resource\Metadata\Resource\Factory\PhpFileResourceClassListFactory"
decorates="sylius.metadata.resource_class_list.factory"
decoration-priority="100"
>
<argument type="service" id="sylius.metadata.resource_extractor.php_file" />
<argument type="service" id=".inner" />
</service>
<service id="Sylius\Resource\Metadata\Resource\Factory\PhpFileResourceClassListFactory" alias="sylius.metadata.resource_class_list.factory.php_file" />
</services>
</container>
Original file line number Diff line number Diff line change
Expand Up @@ -17,16 +17,28 @@
<tag name="cache.pool" />
</service>

<service id="sylius.resource_metadata_collection.factory" alias="sylius.resource_metadata_collection.factory.attributes" />
<service id="Sylius\Resource\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface" alias="sylius.resource_metadata_collection.factory.attributes" />

<service id="sylius.resource_metadata_collection.factory.attributes" class="Sylius\Resource\Metadata\Resource\Factory\AttributesResourceMetadataCollectionFactory">
<argument type="service" id="sylius.resource_registry" />
<argument type="service" id="sylius.routing.factory.operation_route_name_factory" />
</service>
<service id="Sylius\Resource\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface" alias="sylius.resource_metadata_collection.factory.attributes" />
<service id="sylius.resource_metadata_collection.factory" alias="sylius.resource_metadata_collection.factory.attributes" />

<service id="sylius.resource_metadata_collection.factory.php_file"
class="Sylius\Resource\Metadata\Resource\Factory\PhpFileResourceMetadataCollectionFactory"
decorates="sylius.resource_metadata_collection.factory"
decoration-priority="400"
>
<argument type="service" id="sylius.resource_registry" />
<argument type="service" id="sylius.routing.factory.operation_route_name_factory" />
<argument type="service" id="sylius.metadata.resource_extractor.php_file" />
<argument type="service" id=".inner" />
</service>

<service id="sylius.resource_metadata_collection.factory.state_machine"
class="Sylius\Resource\Metadata\Resource\Factory\StateMachineResourceMetadataCollectionFactory"
decorates="sylius.resource_metadata_collection.factory.attributes"
decorates="sylius.resource_metadata_collection.factory"
decoration-priority="300"
>
<argument type="service" id="sylius.resource_registry" />
Expand Down Expand Up @@ -83,15 +95,15 @@

<service id="sylius.resource_metadata_collection.factory.templates_dir"
class="Sylius\Resource\Metadata\Resource\Factory\TemplatesDirResourceMetadataCollectionFactory"
decorates="sylius.resource_metadata_collection.factory.attributes"
decorates="sylius.resource_metadata_collection.factory"
>
<argument type="service" id=".inner" />
<argument>%sylius.resource.settings%</argument>
</service>

<service id="sylius.resource_metadata_collection.factory.cached"
class="Sylius\Resource\Metadata\Resource\Factory\CachedResourceMetadataCollectionFactory"
decorates="sylius.resource_metadata_collection.factory.attributes"
decorates="sylius.resource_metadata_collection.factory"
decoration-priority="-10"
>
<argument type="service" id="sylius.cache.metadata.resource_collection" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
<service id="sylius.resource_metadata_operation.initiator.http_operation" class="Sylius\Resource\Metadata\Operation\HttpOperationInitiator">
<argument type="service" id="sylius.resource_registry" />
<argument type="service" id="sylius.resource_metadata_collection.factory" />
<argument type="service" id="sylius.expression_language.vars_resolver.metadata" />
</service>
<service id="Sylius\Resource\Metadata\Operation\HttpOperationInitiatorInterface" alias="sylius.resource_metadata_operation.initiator.http_operation" />
</services>
Expand Down
Loading
Loading