dkx / slim-body-mapper
该包已被废弃且不再维护。未建议替代包。
将请求体映射到DTO上
1.1.0
2019-06-18 12:34 UTC
Requires
- php: ^7.2
- dkx/method-injector: ^0.0.1
- dkx/slim-injectable-routes: ^0.0.1
- doctrine/annotations: ^1.6
- psr/http-message: ^1.0
- roave/better-reflection: ^3.2
- symfony/validator: ^4.2
Requires (Dev)
- doctrine/cache: ^1.8
- mockery/mockery: dev-master
- phpstan/extension-installer: ^1.0
- phpstan/phpstan: ^0.11.8
- phpstan/phpstan-mockery: ^0.11.1
- phpstan/phpstan-phpunit: ^0.11.2
- phpstan/phpstan-strict-rules: ^0.11.1
- phpunit/phpunit: ^8.0
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\UploadedFile
的DKX\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;
}