proklung / annotatedparamresolverbundle
Symfony 插件,用于将请求参数转换为 DTO。
Requires
- php: >=7.2 | ^8.0
- doctrine/annotations: ^1.10
- proklung/base-exception: ^1.0
- spatie/data-transfer-object: ^2.8
- spiral/attributes: ^2.8
- symfony/config: ^4.4 || ^5.0
- symfony/dependency-injection: ^4.4 || ^5.0
- symfony/framework-bundle: ^4.4 || ^5.0
- symfony/http-kernel: ^4.4 || ^5.0
- symfony/property-access: ^4.4 || ^5.0
- symfony/serializer: ^4.4 || ^5.0
- symfony/validator: ^4.4 || ^5.0
Requires (Dev)
- icanhazstring/composer-unused: ^0.7.5
- proklung/phpunit-testing-tools: ^1.0
- symfony/property-info: ^4.4 || ^5.0
- symfony/yaml: ^4.4 || ^5.0
README
基于 https://github.com/piku235/JungiFrameworkExtraBundle,根据个人需求进行了创造性改进。
例如,除了 DTO 以 stdClass 形式支持外,还支持 SpatieDTO。删除了一些不必要的功能(如cookies、headers等)。
安装
composer require proklung/annotatedparamresolverbundle
注释
- RequestBody - 将请求体转换为控制器(DTO)的参数。
- RequestParams - 将 POST 参数转换为控制器(DTO)的参数。
- QueryParams - 将 GET 参数转换为控制器(DTO)的参数。
同时支持 PHP 8 的注释(甚至 7.2+ 版本)。使用 PHP 8 时,将使用原生的注释解析器。
总体原则
RequestBodyConverted
- 用户自定义类,实现(使用接口作为标记)Prokl\AnnotatedParamResolverBundle\ArgumentResolver\Contracts\UnserializableRequestInterface
。
根据注释,该类的实例将包含 GET、POST 参数请求或转换后的请求体。
可以使用 [use Prokl\AnnotatedParamResolverBundle\Annotation\RequestBody;
use Prokl\AnnotatedParamResolverBundle\Examples\RequestBodyConverted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
class ExampleController extends AbstractController
{
/**
* Параметры аннотации необязательны!
*
* @param RequestBodyConverted $unserialized
*
* @return JsonResponse $content
* @RequestBody(
var="unserialized",
class="Prokl\AnnotatedParamResolverBundle\Examples\RequestBodyConverted",
validate=true
)
*/
public function action(
RequestBodyConverted $unserialized
): JsonResponse {
return new JsonResponse();
}
}
也可以这样做(默认启用验证)use Prokl\AnnotatedParamResolverBundle\Annotation\RequestBody;
use Prokl\AnnotatedParamResolverBundle\Examples\RequestBodyConverted;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
class ExampleController extends AbstractController
{
/**
* Параметры аннотации необязательны!
*
* @param RequestBodyConverted $unserialized
*
* @return JsonResponse $content
* @RequestBody()
*/
public function action(
RequestBodyConverted $unserialized
): JsonResponse {
return new JsonResponse();
}
}
验证
在实现 UnserializableRequestInterface
的类中,类的属性可以应用任何标准的或自定义的 Symfony 验证器。
注释中的 validate 选项控制验证,无论类属性中的注释如何。
use Prokl\AnnotatedParamResolverBundle\ArgumentResolver\Contracts\UnserializableRequestInterface; use Spatie\DataTransferObject\DataTransferObject; use Symfony\Component\Validator\Constraints as Assert; class RequestBodyConvertedSpatie extends DataTransferObject implements UnserializableRequestInterface { /** * @var string $email * * @Assert\Length( * min=3, * minMessage="Email must be at least {{ limit }} characters long" * ) */ public $email; /** * @var integer */ public $numeric; }