我使用FOSRestBundle创建了一个API REST Symfony项目,并且在我抛出POST操作时遇到类型字段验证问题。
了解这个API REST将从React Js项目中使用,而不是从Symfony表单中使用,这一点非常重要。
我的控制器看起来:
<?php
namespace AppBundle\Controller;
use AppBundle\Entity\Team;
use FOS\RestBundle\Controller\FOSRestController;
use FOS\RestBundle\Controller\Annotations as REST;
use FOS\RestBundle\View\View;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Symfony\Component\Validator\ConstraintViolation;
use Symfony\Component\Validator\ConstraintViolationListInterface;
/**
* Add a Team
*
* @param Team $team
* @param ConstraintViolationListInterface $validationErrors
* @return Team
*
* @REST\Post("/team")
* @ParamConverter("team", converter="fos_rest.request_body")
* @REST\View(serializerGroups={"Team"}, statusCode=201);
*/
public function addAction(
Team $team,
ConstraintViolationListInterface $validationErrors
) {
if (count($validationErrors) > 0) {
$view = new View();
$view->setStatusCode(400);
$view->setData($validationErrors);
return $view;
}
$em = $this->getDoctrine()->getManager();
$em->persist($team);
$em->flush();
return $team;
}
我的参数转换器配置(config.yml
文件):
# FOSRestBundle Configuration
fos_rest:
format_listener:
rules:
prefer_extension: false
priorities:
- json
fallback_format: json
view:
view_response_listener: true
empty_content: 204
body_converter:
enabled: true
validate: true
我的实体:
<?php
namespace AppBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation as Serializer;
use Symfony\Component\Validator\Constraints as Validator;
/**
* Team
*
* @ORM\Table(name="teams")
* @ORM\Entity(repositoryClass="AppBundle\Repository\TeamRepository")
*/
class Team
{
/**
* @var string team name
*
* @ORM\Column(name="name", type="string", length=20)
*
* @Serializer\Type("string")
* @Serializer\Groups({"Team"})
*
* @Validator\NotNull(message="Field name is required")
* @Validator\Type(type="string", message="name field has a wrong type")
*/
private $name;
/**
* @var int team players number
*
* @ORM\Column(name="num_players", type="integer")
*
* @Serializer\Type("integer")
* @Serializer\Groups({"Person"})
*
* @Validator\NotNull(message="Field num_players is required")
* @Validator\Type(type="integer", message="num_players field has wrong type")
*/
private $num_players;
public function getName()
{
return $this->name;
}
public function setName(string $name)
{
$this->name = $name;
}
public function getNumPlayers()
{
return $this->num_players;
}
public function setNumPlayers(int $numPlayers)
{
$this->num_players = $numPlayers;
}
}
然后当我发送以下POST动作时:
{
"name" : "Chelsea FC",
"num_players" : "sdfkjls"
}
我创建了状态代码201 和API响应:
{
"id" : 1,
"name" : "Chelsea FC",
"num_players" : 0
}
如果我发送一个字符串值(&#34;&#34; sdfkjls&#34;&#34;),为什么Controller方法不会抛出验证类型错误(statusCode 400)整数类型字段?
似乎 @Validator \ Type(类型=&#34;整数&#34;,...)&#34; num_players&#34;字段注释不起作用,我不知道为什么..
如何解决此API REST验证问题? 感谢。