proklung/annotatedparamresolverbundle

Symfony 插件,用于将请求参数转换为 DTO。

1.2.3 2021-08-14 11:35 UTC

This package is auto-updated.

Last update: 2024-09-14 18:09:51 UTC


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;
}