SyliusResourceBundle icon indicating copy to clipboard operation
SyliusResourceBundle copied to clipboard

Add support for DTOs

Open loic425 opened this issue 2 years ago • 2 comments

Q A
Bug fix? no
New feature? yes
BC breaks? no
Deprecations? no
Related tickets
License MIT

DTO support for create and update operations.

Routes

app_register_user:
    path: /users/register
    methods: [POST]
    defaults:
        _controller: app.controller.user:createAction
        _sylius:
            input: App\Dto\Register
            output: App\Dto\User
            form: App\Form\Type\RegisterType
<?php

namespace App\Entity;

use App\Dto\Register;
use App\Dto\User as DtoUser;

#[SyliusRoute(
    name: 'register',
    path: '/register',
    methods: ['GET', 'POST'],
    controller: 'app.controller.user:createAction',
    form: RegisterType::class,
    input: Register::class,
    output: DtoUser::class
)]
class User

Data transformers

<?php

declare(strict_types=1);

namespace App\DataTransformer;

use App\Dto\Register;
use App\Entity\User;
use Sylius\Bundle\ResourceBundle\Controller\RequestConfiguration;
use Sylius\Bundle\ResourceBundle\DataTransformer\DataTransformerInterface;
use Webmozart\Assert\Assert;

final class RegisterToUserEntityDataTransformer implements DataTransformerInterface
{
    public function transform(object $data, string $to, RequestConfiguration $configuration): User
    {
        Assert::isInstanceOf($data, Register::class);

        $user = new User();
        $user->setUsername($data->username);
        $user->setPassword($data->password);

        return $user;
    }

    public function supportsTransformation(object $data, string $to, RequestConfiguration $configuration): bool
    {
        return $data instanceof Register && is_a($to, User::class, true);
    }
}

<?php

declare(strict_types=1);

namespace App\DataTransformer;

use App\Dto\User;
use App\Entity\User as UserEntity;
use Sylius\Bundle\ResourceBundle\Controller\RequestConfiguration;
use Sylius\Bundle\ResourceBundle\DataTransformer\DataTransformerInterface;
use Webmozart\Assert\Assert;

final class UserEntityToDtoDataTransformer implements DataTransformerInterface
{
    public function transform(object $data, string $to, RequestConfiguration $configuration): User
    {
        Assert::isInstanceOf($data, UserEntity::class);

        return new User($data->getUsername() ?: '');
    }

    public function supportsTransformation(object $data, string $to, RequestConfiguration $configuration): bool
    {
        return $data instanceof UserEntity && is_a($to, User::class, true);
    }
}

  • [x] create

    • [x] input
    • [x] output
  • [x] update

    • [x] input
    • [x] output
  • [x] Remove bc-break with resource form factory

loic425 avatar Apr 04 '22 16:04 loic425