Symfony 3 约束验证日期或日期时间
Symfony 3 Constraint validation Date or Datetime
我尝试通过将表单验证到 Symfony (3.2) 来验证日期(或日期时间)。
我正在使用 FOSRestBundle 来使用来自请求的 json(因为我试图开发我的个人 API)
但我已经尝试了很多格式:
- 2017-04-09
- 17-04-09
- 对于日期时间:
- 2017-04-0921: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
- Header: application/json
Body(原始):
{"place":{"name":"name","address":"an address","created":"1997-12-12"}}
我不确定我使用的格式是否正确,或者我的文件中是否遗漏了任何内容:/
请你打开我心中的灯好吗!?! :)
非常感谢您的帮助。
法布里斯
您的表单类型中 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
我尝试通过将表单验证到 Symfony (3.2) 来验证日期(或日期时间)。
我正在使用 FOSRestBundle 来使用来自请求的 json(因为我试图开发我的个人 API)
但我已经尝试了很多格式:
- 2017-04-09
- 17-04-09
- 对于日期时间:
- 2017-04-0921: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
- Header: application/json
Body(原始):
{"place":{"name":"name","address":"an address","created":"1997-12-12"}}
我不确定我使用的格式是否正确,或者我的文件中是否遗漏了任何内容:/
请你打开我心中的灯好吗!?! :)
非常感谢您的帮助。 法布里斯
您的表单类型中 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