pioniro/request-response-model-converter-bundle

序列化和反序列化您的请求和响应模型

1.0.1 2020-04-03 17:25 UTC

This package is auto-updated.

Last update: 2024-09-29 05:55:35 UTC


README

这是一个组件,它可以实现以下魔法:

之前

// Controller/MyAwfulController.php
namespace App\Controller;

use \Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;


class MyAwfulController extends AbstractController
{
    public function sum(Request $request)
    {
        if($request->isMethod('POST')) {
            $a = $request->request->getDigits('a');
            $b = $request->request->getDigits('b');
        } else {
            $a = $request->query->getDigits('a');
            $b = $request->query->getDigits('b');
        }
        if(is_null($a) || is_null($b)) {
            throw new RuntimeException('a and b should not be null');
        }
        return new JsonResponse(['result' => floatval($a) + floatval($b)]);
    }
}

或者使用表单。这不很糟糕吗?

之后

// Model\Request\SumRequest.php
namespace App\Model\Request;

use JMS\Serializer\Annotation as Serializer;
use Pioniro\RequestResponseModel\RequestModelInterface;
use Symfony\Component\Validator\Constraints as Assert;

class SumRequest implements RequestModelInterface
{
    /**
    * @var float
    * @Serializer\Type("float")
    * @Assert\NotNull()
    */
    protected $a;

    /**
    * @var float
    * @Serializer\Type("float")
    * @Assert\NotNull()
    */
    protected $b;

    public function getA(): float
    {
        return $this->a;
    }

    public function getB(): float
    {
        return $this->b;
    }

}
// Model\Request\ResultResponse.php
namespace App\Model\Response;

use JMS\Serializer\Annotation as Serializer;
use Pioniro\RequestResponseModel\RequestModelInterface;
use Pioniro\RequestResponseModel\ResponseModelInterface;
use Symfony\Component\Validator\Constraints as Assert;

class ResultResponse implements ResponseModelInterface
{
    /**
    * @var float
    * @Serializer\Type("float")
    */
    protected $result;

    public function __construct(float $result) {
        $this->result = $result;
    }
}

// Controller/MyAwesomeController.php
namespace App\Controller;

use \Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;


class MyAwesomeController extends AbstractController
{
    public function sum(SumRequest $request)
    {
        return new ResultResponse($request->getA() + $request->getB());
    }
}

你看到了吗?没有手动验证,没有手动填充模型,没有处理异常,没有难以测试的响应!只有你的逻辑。

这就是为什么这个组件存在的原因。