dkx/slim-body-mapper

该包已被废弃且不再维护。未建议替代包。

将请求体映射到DTO上

1.1.0 2019-06-18 12:34 UTC

This package is auto-updated.

Last update: 2024-01-18 23:14:10 UTC


README

将请求体映射到DTO上

安装

$ composer require dkx/slim-body-mapper

使用

想象一下,您可以将传入的HTTP请求数据定义为DTO,并使用symfony/validation自动进行验证,然后将其注入到路由处理器中,如下所示

<?php

use DKX\SlimBodyMapper\MappedHttpRequestBody;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Symfony\Component\Validator\Constraints as Assert;

class UserDTO implements MappedHttpRequestBody
{

    /**
     * @var string
     * @Assert\Type("string")
     * @Assert\NotBlank
     * @Assert\Email
     */
    public $email;
    
    /**
     * @var string
     * @Assert\Type("string")
     * @Assert\NotBlank 
     */
    public $password;

}

final class CreateUserController
{

    public function __invoke(ServerRequestInterface $request, ResponseInterface $response, array $args, UserDTO $user): ResponseInterface
    {
        // todo: save $user to DB
        return $response;
    }

}

这正是这个库所做的事情。

配置

<?php

use DKX\SlimBodyMapper\BodyMapper;
use DKX\SlimInjectableRoutes\InjectableRoutes;
use Slim\Container;

$c = new Container();
$c['foundHandler'] = function() {
    $routes = new InjectableRoutes;
    $bodyMapper = new BodyMapper;
    $routes->provideInjectableSetup($bodyMapper->getInjectableSetup());
    
    return $routes;
};

如果您想知道我们做了什么,请查看dkx/slim-injectable-routes的文档。

验证

默认情况下不启用验证。要更改此设置,请创建ValidatorInterface对象并将其设置为BodyMapper

<?php

$validator = createValidatorSamehow();
$bodyMapper = new BodyMapper;
$bodyMapper->setValidator($validator);

自定义键名

<?php

use DKX\SlimBodyMapper\Annotations as Mapping;
use DKX\SlimBodyMapper\MappedHttpRequestBody;

class UserDTO implements MappedHttpRequestBody
{

    /**
     * @Mapping\Path("user_name")
     * @var string
     */
    public $userName;

}

文件上传

Base64编码的文件可以自动转换为扩展了Slim\Http\UploadedFileDKX\SlimBodyMapper\UploadedFile

它增加了使用symfony/validation验证此类文件的可能性。

<?php

use DKX\SlimBodyMapper\Annotations as Mapping;
use DKX\SlimBodyMapper\MappedHttpRequestBody;

class UserDTO implements MappedHttpRequestBody
{

    /**
     * @Mapping\UploadedFile
     * @var \DKX\SlimBodyMapper\UploadedFile
     */
    public $avatar;

}