Symfony 3约束验证日期或日期时间

时间:2017-04-09 20:06:34

标签: symfony validation date constraints fosrestbundle

我尝试通过验证表格来验证日期(或日期时间)到Symfony(3.2)。

我使用FOSRestBundle从请求中使用json(因为我尝试开发我的个人API)

但是我尝试了很多格式:

  • 2017年4月9日
  • 17-04-09
  • 表示日期时间:
    • 2017-04-09 21:12:12
    • 2017-04-09T21:12:12
    • 2017-04-09T21:12:12 + 01:00
  • ...

但是表单无效,我总是遇到这个错误: 该值无效

我的控制器的功能

public function postPlacesAction(Request $request) {
    $place = new Place();
    $form = $this->createForm(PlaceType::class, $place);

    $form->handleRequest($request);

    if ($form->isValid()) {
        return $this->handleView($this->view(null, Response::HTTP_CREATED));
    } else {
        return $this->handleView($this->view($form->getErrors(), Response::HTTP_BAD_REQUEST));
    }
}

我的实体

class Place
{
    /**
     * @var string
     *
     * @Assert\NotBlank(message = "The name should not be blank.")
     */
    protected $name;

    /**
     * @var string
     *
     * @Assert\NotBlank(message = "The address should not be blank.")
     */
    protected $address;

    /**
     * @var date
     *
     * @Assert\Date()
     */
    protected $created;

    // ....
    // Getter and setter of all var

我的实体类型

class PlaceType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name');
        $builder->add('address');
        $builder->add('created');
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => 'MyBundle\Entity\Place',
            'csrf_protection' => false
        ]);
    }
}

请求示例(我使用邮差)

  • 方法:POST
  • 标题:application / json
  • 身体(原始):

    {"place":{"name":"name","address":"an address","created":"1997-12-12"}}
    

我不确定我是否使用了正确的格式,或者我在文件中遗漏了任何内容:/

请你打开我心中的灯!?! :)

非常感谢你的帮助。 和Fabrice

1 个答案:

答案 0 :(得分:3)

表单类型中created字段的问题。使用created语法添加$builder->add('created');字段时,将应用默认类型Symfony\Component\Form\Extension\Core\Type\TextType1997-12-12输入数据是字符串,而不是DateTime实例。< / p>

要解决此问题,您应该在第二个参数DateType中传递$builder->add('created', 'Symfony\Component\Form\Extension\Core\Type\DateType');。此表单类型具有转换器,可将输入数据1997-12-12转换为DateTime实例。

有关Symfony表单类型的更多信息,请查看Form Types Reference