【问题标题】:Symfony 3 Constraint validation Date or DatetimeSymfony 3 约束验证日期或日期时间
【发布时间】:2017-09-04 19:12:24
【问题描述】:

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

我正在使用 FOSRestBundle 来使用来自请求的 json(因为我尝试开发我的个人 API)

但我尝试了很多格式:

  • 2017-04-09
  • 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
        ]);
    }
}

请求示例(我使用的是 Postman)

  • 方法:POST
  • 标题:应用程序/json
  • 正文(原始):

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

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

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

非常感谢您的帮助。 法布里斯

【问题讨论】:

    标签: symfony validation date constraints fosrestbundle


    【解决方案1】:

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

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

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

    【讨论】:

    • 因为我已经在实体的var上设置了@Assert\Date(),所以我认为没有必要将它放入表单中。所以我刚刚测试了你的解决方案,我总是遇到同样的错误:{"form":{"children":{"name":{},"address":{},"created":{"errors":["This value is not valid."],"children":{"year":{},"month":{},"day":{}}}}},"errors":[]}
    • 您是否按照我说的更新了表单?如果是,您应该添加一个附加选项$builder->add('created', 'Symfony\Component\Form\Extension\Core\Type\DateType', ['widget' => 'single_text']);
    • 是的,我输入了:$builder->add('created', DateType::class();。但是现在有了您的附加选项,没关系!我已经阅读了文档,但我不太了解小部件选项的含义。我的解决方案是:$builder->add('created', DateType::class, ['widget' => 'single_text']); 非常感谢。
    • 很高兴它的帮助,widget 选项让DateTime 表单类型知道输入数据的类型以及如何在模板中呈现此表单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多