Loyalty Rule

Adding new Loyalty Rule Configuration to API

After creating a new loyalty rule configuration you need to add a new LoyaltyRuleActionDataTransformer that implements Sylius\Plus\Loyalty\Infrastructure\DataTransformer\LoyaltyRuleActionDataTransformerInterface To be more flexible, new LoyaltyRuleConfiguration is created by new DTO object: Sylius\Plus\Loyalty\Application\DTO\LoyaltyRuleAction that has configuration field as an array That field allows you to add any configuration and in the aftermath, you have to transform this object to Sylius\Plus\Loyalty\Domain\Model\LoyaltyRuleConfiguration\LoyaltyRuleConfigurationInterface instance by your custom LoyaltyRuleActionDataTransformer Exemplary LoyaltyRuleActionYourCustomConfigurationDataTransformer for new your_custom_configuration configuration type:

use Sylius\Plus\Loyalty\Application\DTO\LoyaltyRuleActionInterface as LoyaltyRuleActionInterfaceDTO;
use Sylius\Plus\Loyalty\Domain\Model\LoyaltyRuleActionInterface as LoyaltyRuleActionInterfaceModel;

final class LoyaltyRuleActionYourCustomConfigurationDataTransformer implements LoyaltyRuleActionDataTransformerInterface
{
    /** @var LoyaltyRuleActionFactoryInterface */
    private $loyaltyRuleActionFactory;

    public function __construct(LoyaltyRuleActionFactoryInterface $loyaltyRuleActionFactory)
    {
        $this->loyaltyRuleActionFactory = $loyaltyRuleActionFactory;
    }

    public function transform(LoyaltyRuleActionInterfaceDTO $object, string $to, array $context = []): LoyaltyRuleActionInterfaceModel
    {
        //$object is an input LoyaltyRuleActionInterfaceDTO instance that allow you get new changes and create/update a LoyaltyRuleActionInterfaceModel object

        if (isset($context['object_to_populate'])) {
            /** @var LoyaltyRuleActionInterfaceModel $loyaltyRuleAction */
            $loyaltyRuleAction = $context['object_to_populate'];

            //update object while using PUT or PATCH method

            return $loyaltyRuleAction;
        }

        //create new LoyaltyRuleActionInterfaceModel object while using POST method

        return $this
            ->loyaltyRuleActionFactory
            ->createNewWithDataAndConfiguration('your_custom_configuration', $configuration)
        ;
    }

    public function supportsTransformation(string $actionType): bool
    {
        return $actionType === 'your_custom_configuration';
    }
}

Next you must register LoyaltyRuleActionYourCustomConfigurationDataTransformer as a service with tag sylius_plus.api.loyalty_rule_action_data_transformer and key that is same as given configuration type:

<service id="...\LoyaltyRuleActionYourCustomConfigurationDataTransformer" public="true">
    <argument type="service" id="Sylius\Plus\Loyalty\Application\Factory\LoyaltyRuleActionFactory" />
    <tag name="sylius_plus.api.loyalty_rule_action_data_transformer" key="your_custom_configuration" />
</service>
../../_images/banner5.png