Symfony:API REST验证似乎不起作用

时间:2017-05-11 08:43:50

标签: php rest symfony validation fosrestbundle

我使用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验证问题? 感谢。

0 个答案:

没有答案