thiagocordeiro / serializer-bundle
PHP 序列化 Symfony 扩展包
3.3.1
2022-03-13 22:58 UTC
Requires
- php: >=8.0
- ext-json: *
- symfony/config: ^6.0.0
- symfony/dependency-injection: ^6.0.0
- symfony/http-kernel: ^6.0.0
- thiagocordeiro/serializer: ^3.2
Requires (Dev)
- phpstan/phpstan: ^1.4
- phpunit/phpunit: ^9.5
- slevomat/coding-standard: ^7.0
- symfony/var-dumper: ^6.0.0
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_dir
和 check_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; } }