【问题标题】:Validating that a date is greater or equal than another date, without entity验证一个日期大于或等于另一个日期,没有实体
【发布时间】:2014-10-12 12:42:44
【问题描述】:

我构建了一个与任何实体无关的表单。

class CalculatorType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
        ->add('debutActivite', 'date', array(
            'label' => 'Quand avez-vous commencé votre activité ?',
            'widget' => 'single_text',
            'format' => 'dd/MM/yyyy',
            'label_attr' => array(
                'class' => 'control-label',
            ),
            'attr' => array(
                'class' => 'form-control createDatepicker',
                'placeholder' => 'dd/mm/aaaa',
            ),
            'required' => true,
        ))
        ->add('demandeAccreAccepteeDate', 'date', array(
            'label' => 'A quelle date a-t-elle été acceptée ?',
            'widget' => 'single_text',
            'format' => 'dd/MM/yyyy',
            'label_attr' => array(
                'class' => 'control-label',
            ),
            'attr' => array(
                'class' => 'form-control createDatepicker',
                'placeholder' => 'dd/mm/aaaa',
            ),
        ))
    }
}

在我的控制器中,我检查表单是否有效:

public function indexAction(Request $request)
{
    $form = $this->createForm(new CalculatorType(), array());

    $form->handleRequest($request);

    if ($form->isValid()) {
        $data = $form->getData();
    }
}

“demandeAccreAccepteeDate”字段不是必需的。但如果它不为空,我想验证它是否大于或等于“debutActivite”字段。

知道我没有计算器实体,我怎么能做这样的事情?

【问题讨论】:

    标签: validation date symfony comparison


    【解决方案1】:

    创建一个类(你不需要在数据库中持久化它)来保存你的日期

    namespace Your\Bundle;
    
    use Symfony\Component\Validator\Constraints as Assert;
    use Symfony\Component\Validator\ExecutionContextInterface;
    
    class Daterange
    {
    
        /**
         * @Assert\Date()
         */
        public $debutActivite;
    
        /**
         * @Assert\Date()
         */
        public $demandeAccreAccepteeDate;
    
        /**
         * @Assert\Callback
         */
        public function validate(ExecutionContextInterface $context)
        {
            // Do your checks
            if ( ($this->demandeAccreAccepteeDate != '') && 
                   ($this->demandeAccreAccepteeDate < $this->debutActivite) ) {
    
                $context->addViolationAt(
                    'demandeAccreAccepteeDate',
                    'Date not valid. Is before debutActivite',
                    array(),
                    null
                );
    
            }
    
        }
    
    }
    

    为您的表单指定日期

    class CalculatorType extends AbstractType
    {
    
        [..]
    
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setDefaults(array(
                'data_class' => 'Your\Bundle\Daterange',
            ));
        }
    
    }
    

    并在您的控制器中以这种方式创建表单(在开头添加use Your\Bundle\Daterange

    $form = $this->createForm(new CalculatorType(), new Daterange());
    

    【讨论】:

    • 我必须将该 Daterange 类存储在实体文件夹中吗?还是实体文件夹仅用于持久类?
    • 你可以把它保存在你喜欢的地方。
    • 最佳实践怎么样?我是否应该将它保存在实体中,即使这个对象永远不会被持久化到 DB 中?或者在名为“模型”的新文件夹中?
    • 这是另一个主题,与您的问题无关。我的解决方案有效吗?如果是,请接受。
    • 您的解决方案有效。我将 Daterange 类更改为 Calculator 类,并添加了所有其他字段。我现在正在对这个 validate() 方法进行所有自定义验证。谢谢。
    猜你喜欢
    • 2015-11-17
    • 2012-05-26
    • 1970-01-01
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2023-03-29
    • 2021-07-11
    相关资源
    最近更新 更多