我对 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
我可以重现问题;经过几次测试后,我注意到一些奇怪的东西,这使它看起来像一个错误:
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 文档。
symfony new my_project_directory --version="7.0.*"
。composer require symfony/validator symfony/serializer-pack
;symfony server:start --no-tls
;curl 'http://localhost:8000/query?firstName=John&lastName=Smith&age=27'
,然后看看差异。这似乎只是 use 语句中的拼写错误,在 QueryController 文件中将 chenge
use App\Model\UserDto;
改为 use App\Model\UserDTO;
。