Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 6 additions & 0 deletions psalm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,12 @@
</errorLevel>
</MissingClassConstType>

<MissingConstructor>
<errorLevel type="suppress">
<file name="src/Component/src/Metadata/Mutator/ResourceResourceMutatorCollection.php" />
</errorLevel>
</MissingConstructor>

<MissingParamType>
<errorLevel type="suppress">
<file name="src/Bundle/Routing/ResourceLoader.php" />
Expand Down
39 changes: 39 additions & 0 deletions src/Bundle/DependencyInjection/SyliusResourceExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,13 @@
use Sylius\Component\Resource\Factory\FactoryInterface as LegacyFactoryInterface;
use Sylius\Resource\Factory\Factory;
use Sylius\Resource\Factory\FactoryInterface;
use Sylius\Resource\Metadata\AsOperationMutator;
use Sylius\Resource\Metadata\AsResource;
use Sylius\Resource\Metadata\AsResourceMutator;
use Sylius\Resource\Metadata\Metadata;
use Sylius\Resource\Metadata\OperationMutatorInterface;
use Sylius\Resource\Metadata\ResourceMetadata;
use Sylius\Resource\Metadata\ResourceMutatorInterface;
use Sylius\Resource\Reflection\ClassReflection;
use Sylius\Resource\State\ProcessorInterface;
use Sylius\Resource\State\ProviderInterface;
Expand All @@ -34,6 +38,7 @@
use Symfony\Component\Config\FileLocator;
use Symfony\Component\Config\Loader\LoaderInterface;
use Symfony\Component\Config\Resource\DirectoryResource;
use Symfony\Component\DependencyInjection\ChildDefinition;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
Expand Down Expand Up @@ -76,6 +81,40 @@ public function load(array $configs, ContainerBuilder $container): void
$this->loadPersistence($config['drivers'], $config['resources'], $loader, $container);
$this->loadResources($config['resources'], $container);

$container->registerAttributeForAutoconfiguration(
AsResourceMutator::class,
static function (ChildDefinition $definition, AsResourceMutator $attribute, \Reflector $reflector): void {
if (!$reflector instanceof \ReflectionClass) {
return;
}

if (!is_a($reflector->name, ResourceMutatorInterface::class, true)) {
throw new RuntimeException(\sprintf('Resource mutator "%s" should implement %s', $reflector->name, ResourceMutatorInterface::class));
}

$definition->addTag('sylius.resource_mutator', [
'resourceClass' => $attribute->resourceClass,
]);
},
);

$container->registerAttributeForAutoconfiguration(
AsOperationMutator::class,
static function (ChildDefinition $definition, AsOperationMutator $attribute, \Reflector $reflector): void {
if (!$reflector instanceof \ReflectionClass) {
return;
}

if (!is_a($reflector->name, OperationMutatorInterface::class, true)) {
throw new RuntimeException(\sprintf('Operation mutator "%s" should implement %s', $reflector->name, OperationMutatorInterface::class));
}

$definition->addTag('sylius.operation_mutator', [
'operationName' => $attribute->operationName,
]);
},
);

$container->registerForAutoconfiguration(ProviderInterface::class)
->addTag('sylius.state_provider')
;
Expand Down
13 changes: 13 additions & 0 deletions src/Bundle/Resources/config/services/metadata/extractor.xml
Original file line number Diff line number Diff line change
@@ -1,3 +1,16 @@
<?xml version="1.0" ?>

<!--

This file is part of the Sylius package.

(c) Sylius Sp. z o.o.

For the full copyright and license information, please view the LICENSE
file that was distributed with this source code.

-->

<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">
Expand Down
23 changes: 23 additions & 0 deletions src/Bundle/Resources/config/services/metadata/mutator.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?xml version="1.0" ?>

<!--

This file is part of the Sylius package.

(c) Sylius Sp. z o.o.

For the full copyright and license information, please view the LICENSE
file that was distributed with this source code.

-->

<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.mutator_collection.resource" class="Sylius\Resource\Metadata\Mutator\ResourceResourceMutatorCollection" public="false" />

<service id="sylius.metadata.mutator_collection.operation" class="Sylius\Resource\Metadata\Mutator\OperationResourceMutatorCollection" public="false" />
</services>
</container>
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,15 @@
<argument type="service" id=".inner" />
</service>

<service id="sylius.metadata.resource.metadata_collection_factory.mutator"
class="Sylius\Resource\Metadata\Resource\Factory\MutatorResourceMetadataCollectionFactory"
decorates="sylius.resource_metadata_collection.factory"
decoration-priority="400">
<argument type="service" id="sylius.metadata.mutator_collection.resource" />
<argument type="service" id="sylius.metadata.mutator_collection.operation" />
<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"
Expand Down
2 changes: 2 additions & 0 deletions src/Bundle/SyliusResourceBundle.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
use Sylius\Bundle\ResourceBundle\DependencyInjection\PagerfantaExtension;
use Sylius\Resource\Symfony\DependencyInjection\Compiler\DisableMetadataCachePass;
use Sylius\Resource\Symfony\DependencyInjection\Compiler\FallbackToKernelDefaultLocalePass;
use Sylius\Resource\Symfony\DependencyInjection\Compiler\MutatorPass;
use Symfony\Component\DependencyInjection\Compiler\PassConfig;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\Bundle\Bundle;
Expand All @@ -54,6 +55,7 @@ public function build(ContainerBuilder $container): void
$container->addCompilerPass(new FallbackToKernelDefaultLocalePass());
$container->addCompilerPass(new DoctrineContainerRepositoryFactoryPass());
$container->addCompilerPass(new DoctrineTargetEntitiesResolverPass(new TargetEntitiesResolver()), PassConfig::TYPE_BEFORE_OPTIMIZATION, 1);
$container->addCompilerPass(new MutatorPass());
$container->addCompilerPass(new RegisterFormBuilderPass());
$container->addCompilerPass(new RegisterFqcnControllersPass());
$container->addCompilerPass(new RegisterResourceRepositoryPass());
Expand Down
23 changes: 23 additions & 0 deletions src/Component/src/Metadata/AsOperationMutator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?php

/*
* This file is part of the Sylius package.
*
* (c) Sylius Sp. z o.o.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace Sylius\Resource\Metadata;

#[\Attribute(\Attribute::TARGET_CLASS)]
class AsOperationMutator
{
public function __construct(
public readonly string $operationName,
) {
}
}
26 changes: 26 additions & 0 deletions src/Component/src/Metadata/AsResourceMutator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

/*
* This file is part of the Sylius package.
*
* (c) Sylius Sp. z o.o.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace Sylius\Resource\Metadata;

#[\Attribute(\Attribute::TARGET_CLASS)]
class AsResourceMutator
{
/**
* @param class-string $resourceClass
*/
public function __construct(
public readonly string $resourceClass,
) {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

/*
* This file is part of the Sylius package.
*
* (c) Sylius Sp. z o.o.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace Sylius\Resource\Metadata\Mutator;

use Psr\Container\ContainerInterface;
use Sylius\Resource\Metadata\OperationMutatorInterface;

/**
* Collection of Operation mutators to mutate Operation metadata.
*/
interface OperationMutatorCollectionInterface extends ContainerInterface
{
/**
* @return list<OperationMutatorInterface>
*/
public function get(string $id): mixed;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
<?php

/*
* This file is part of the Sylius package.
*
* (c) Sylius Sp. z o.o.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace Sylius\Resource\Metadata\Mutator;

use Sylius\Resource\Metadata\OperationMutatorInterface;

/**
* @internal
*/
final class OperationResourceMutatorCollection implements OperationMutatorCollectionInterface
{
private array $mutators = [];

/**
* Adds a mutator to the container for a given operation name.
*/
public function add(string $operationName, OperationMutatorInterface $mutator): void
{
$this->mutators[$operationName][] = $mutator;
}

public function get(string $id): array
{
return $this->mutators[$id] ?? [];
}

public function has(string $id): bool
{
return isset($this->mutators[$id]);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

/*
* This file is part of the Sylius package.
*
* (c) Sylius Sp. z o.o.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace Sylius\Resource\Metadata\Mutator;

use Psr\Container\ContainerInterface;
use Sylius\Resource\Metadata\ResourceMutatorInterface;

/**
* Collection of Resource mutators to mutate ResourceMetadata.
*/
interface ResourceMutatorCollectionInterface extends ContainerInterface
{
/**
* @return list<ResourceMutatorInterface>
*/
public function get(string $id): array;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php

/*
* This file is part of the Sylius package.
*
* (c) Sylius Sp. z o.o.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace Sylius\Resource\Metadata\Mutator;

use Sylius\Resource\Metadata\ResourceMutatorInterface;

/**
* @internal
*/
final class ResourceResourceMutatorCollection implements ResourceMutatorCollectionInterface
{
private array $mutators;

public function addMutator(string $resourceClass, ResourceMutatorInterface $mutator): void
{
$this->mutators[$resourceClass][] = $mutator;
}

public function get(string $id): array
{
return $this->mutators[$id] ?? [];
}

public function has(string $id): bool
{
return isset($this->mutators[$id]);
}
}
19 changes: 19 additions & 0 deletions src/Component/src/Metadata/OperationMutatorInterface.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

/*
* This file is part of the Sylius package.
*
* (c) Sylius Sp. z o.o.
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/

declare(strict_types=1);

namespace Sylius\Resource\Metadata;

interface OperationMutatorInterface
{
public function __invoke(Operation $operation): Operation;
}
Loading