thiagocordeiro/serializer-bundle

PHP 序列化 Symfony 扩展包

3.3.1 2022-03-13 22:58 UTC

This package is auto-updated.

Last update: 2024-09-14 04:11:21 UTC


README

一个用于 thiagocordeiro/serializer 的 Symfony 扩展包

如何使用

composer require thiagocordeiro/serializer-bundle

然后在 config/bundles.php 中添加以启用扩展包

<?php

return [
    Symfony\Bundle\FrameworkBundle\FrameworkBundle::class => ['all' => true],
    ...
    Serializer\SerializerBundle\SerializerBundle::class => ['all' => true],
];

配置

您可以配置缓存类将创建的位置 cache_dircheck_timestamp 以检查类是否更改,以便更新缓存。

以下 YAML 包含针对生产环境优化的默认配置,但您可能需要在开发环境中将 check_timestamp 设置为 true

要自定义,只需在 config/packages/dev/serializer.yaml 中创建一个自定义配置文件。

# config/packages/dev/serializer.yaml
parameters:
  serializer.cache_dir: '%kernel.cache_dir%'
  serializer.check_timestamp: true # Note that the customization should be only on dev env folder

在控制器上返回值对象

此扩展包向 symfony 添加了一个内核事件监听器,因此您可以在控制器上返回对象,该对象将被转换为包含序列化数据的 JsonResponse。

<?php

namespace App\Framework\Controller\User;

use App\Domain\User\CreateUserService;
use App\Domain\User\CreateUser;
use App\Domain\User\UserCreated;
use Serializer\Serializer;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\HttpException;

class CreateUserController
{
    /** @var CreateUserService */
    private $service;

    /** @var Serializer */
    private $serializer;

    public function __construct(CreateUserService $service, Serializer $serializer)
    {
        $this->service = $service;
        $this->serializer = $serializer;
    }

    public function __invoke(Request $request): UserCreated
    {
        $createUser = $this->serializer->deserialize((string) $request->getContent(), CreateUser::class);

        try {
            $userCreated = $this->service->create($createUser);
        } catch (UserAlreadyRegistered $e) {
            throw new HttpException(Response::HTTP_CONFLICT, 'User Already Registered', $e);
        }

        return $userCreated;
    }
}

在控制器上注入值对象

您还可以在控制器上注入对象,内部扩展包将从请求体中创建对象。为此,您必须告诉扩展包应创建哪些对象,为此,在 config/packages/serializer.yaml 中创建一个包含类名的 YAML 文件

# config/packages/serializer.yaml - note it should not be on env(dev/prod) folder)
parameters:
    serializer.value_objects:
        - 'App\Domain\User\CreateUser'
        - 'App\Domain\User\UserCreated'
        - ... other classes you may want to add

设置完成后,您将能够注入此对象,在上面的示例中,代码将更加简单。

...

class CreateUserController
{
    /** @var CreateUserService */
    private $service;

    public function __construct(CreateUserService $service)
    {
        $this->service = $service;
    }

    public function __invoke(CreateUser $createUser): UserCreated
    {
        try {
            $userCreated = $this->service->create($createUser);
        } catch (UserAlreadyRegistered $e) {
            throw new HttpException(Response::HTTP_CONFLICT, 'User Already Registered', $e);
        }

        return $userCreated;
    }
}