加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读