控制器返回 500(无法对类型对象进行非规范化)

问题描述 投票:0回答:1

我对 Symfony 非常陌生。

我正在这里学习控制器 https://symfony.com/doc/current/controller.html

控制器

namespace App\Controller;

use App\Model\UserDto;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Attribute\MapQueryString;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Attribute\Route;


class QueryController extends AbstractController
{
    #[Route('/query', name: 'app_query')]
    public function index(
        #[MapQueryString] UserDTO $userDto
    ): JsonResponse {
        return $this->json(['dto' => $userDto]);
    }
}

型号

namespace App\Model;

use Symfony\Component\Validator\Constraints as Assert;

class UserDTO
{
    public function __construct(
        #[Assert\NotBlank]
        public string $firstName,

        #[Assert\NotBlank]
        public string $lastName,

        #[Assert\GreaterThan(18)]
        public int $age,
    ) {
    }
}

但它抛出以下错误。

无法对“App\Model\UserDto”类型的对象进行非规范化,否 找到支持标准化器。

Symfony 版本为 7

查询字符串

/查询?firstName=约翰&lastName=史密斯&年龄=27

编辑(不是来自OP)

我可以重现问题;经过几次测试后,我注意到一些奇怪的东西,这使它看起来像一个错误:

  • 每次运行
    rm var/cache/* -rf
    后,预期的响应都会很好地返回,仅对于第一个请求,然后OP的错误会随着进一步的请求而永远发生(“无法对对象进行非规范化[...]”)
  • 跑步
    ./bin/console clear:cache
    没有什么特别的。

rm var/cache/* -rf
之后的响应输出:

{
    "dto": {
        "firstName": "John",
        "lastName": "Smith",
        "age": 27
    }
}

进一步请求的响应输出:

{
    "type": "https:\/\/tools.ietf.org\/html\/rfc2616#section-10",
    "title": "An error occurred",
    "status": 500,
    "detail": "Could not denormalize object of type \"App\\Model\\UserDto\", no supporting normalizer found.",
    "class": "Symfony\\Component\\Serializer\\Exception\\NotNormalizableValueException",
    // [...]
}

有关 OP 示例的信息来自官方 Symfony 文档

如何重现

  1. 创建一个新的 Symfony 项目:
    symfony new my_project_directory --version="7.0.*"
  2. 需要
    composer require symfony/validator symfony/serializer-pack
  3. 在正确的位置添加OP的类;
  4. 运行您最喜欢的服务器,即
    symfony server:start --no-tls
  5. 运行两次
    curl 'http://localhost:8000/query?firstName=John&lastName=Smith&age=27'
    ,然后看看差异。
php symfony
1个回答
0
投票

这似乎只是 use 语句中的拼写错误,在 QueryController 文件中将 chenge

use App\Model\UserDto;
改为
use App\Model\UserDTO;

© www.soinside.com 2019 - 2024. All rights reserved.