php – Symfony2:在验证器中访问原始表单数据
发布时间:2020-12-13 17:01:12 所属栏目:PHP教程 来源:网络整理
导读:我为Symfony2表单创建了自己的验证器.它被称为ValidDateValidator,它应该过滤掉无效日期,例如2015-02-31.表单类型如下所示: -add( 'thedate',DateType::class,array( 'widget' = 'single_text','format' = 'yyyy-MM-dd','constraints' = array( new ValidDa
我为Symfony2表单创建了自己的验证器.它被称为ValidDateValidator,它应该过滤掉无效日期,例如2015-02-31.表单类型如下所示:
->add( 'thedate',DateType::class,array( 'widget' => 'single_text','format' => 'yyyy-MM-dd','constraints' => array( new ValidDate() ) ) ) 现在,如果我尝试在我的验证器中访问这个,如下所示: public function validate($value,Constraint $constraint){ //this returns 2015-03-03 echo $value->format('Y-m-d'); } 结果我得到“2015-03-03”.有没有办法访问原始表单数据而不进行处理? 解决方法
不幸的是,这是不可能的.验证器在
data transformation之后接收它们的数据.
你可以做的是创建自己的视图转换器并使用它而不是标准的转换器.视图转换器获取输入数据并将其转换为标准数据.在DateField的情况下,这只是DateTime-Object. 您可以在此转换期间抛出异常,这将导致窗体错误.更具体地说,它将显示DateField中的invalid_message. 让我试着举个例子: 变压器: namespace AppBundleFormDataTransformer; use DoctrineCommonPersistenceObjectManager; use SymfonyComponentFormDataTransformerInterface; use SymfonyComponentFormExceptionTransformationFailedException; class StringToDateTransformer implements DataTransformerInterface { /** * Transforms a DateTime object to a string . * * @param DateTime|null $date * @return string */ public function transform($date) { if (null === $date) { return ''; } return $date->format('Y-m-d'); } /** * Transforms a string to a DateTime object. * * @param string $dateString * @return DateTime|null * @throws TransformationFailedException if invalid format/date. */ public function reverseTransform($dateString) { //Here do what ever you would like to do to transform the string to //a DateType object //The important thing is to throw an TransformationFailedException //if something goes wrong (such as wrong format,or invalid date): throw new TransformationFailedException('The date is incorrect!'); return $dateTime; } } 在表单构建器中: $builder->get('thedate') //Important! ->resetViewTransformers() ->addViewTransformer(new StringToDateTransformer()); 注意resetViewTransformers()调用.某些字段(如DateTypealready)具有视图转换器.通过调用此方法,我们摆脱了这个默认变换器,导致只调用我们的transfomrer. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |