【问题标题】:Custom Validator/Constraint with Arguments/Parameters in Symfony 2Symfony 2 中带有参数/参数的自定义验证器/约束
【发布时间】:2012-05-17 20:42:23
【问题描述】:

我想创建一个类似于 GitHub 处理删除存储库的方式的验证器。要确认删除,我需要输入 repo 名称。在这里,我想通过输入实体属性“名称”来确认删除。我需要将名称传递给约束或以某种方式访问​​它,我该怎么做?

【问题讨论】:

    标签: validation symfony


    【解决方案1】:

    您确实可以使用验证器约束来做到这一点:

    1:创建删除表单(直接或使用类型):

        return $this->createFormBuilder($objectToDelete)
            ->add('comparisonName', 'text')
            ->setAttribute('validation_groups', array('delete'))
            ->getForm()
        ;
    

    2:将公共属性comparisonName 添加到您的实体中。 (或使用代理对象),将映射到上面相应的表单字段。

    3:定义一个类级别,回调验证器约束来比较两个值:

    /**
     * @Assert\Callback(methods={"isComparisonNameValid"}, groups={"delete"})
     */
    class Entity 
    {
        public $comparisonName;
        public $name;
    
        public function isComparisonNameValid(ExecutionContext $context)
        {
            if ($this->name !== $this->comparisonName) {
                $propertyPath = $context->getPropertyPath() . '.comparisonName';
                $context->addViolationAtPath(
                    $propertyPath,
                    'Invalid delete name', array(), null
                );
            }
        }
    }
    

    4:在视图中显示表单:

    <form action="{{ path('entity_delete', {'id': entity.id }) }}">
       {{ form_rest(deleteForm) }}
       <input type="hidden" name="_method value="DELETE" />
       <input type="submit" value="delete" />
    </form>
    

    5:要验证删除查询是否有效,请在您的控制器中使用:

        $form    = $this->createDeleteForm($object);
        $request = $this->getRequest();
    
        $form->bindRequest($request);
        if ($form->isValid()) {
            $this->removeObject($object);
            $this->getSession()->setFlash('success',
                $this->getDeleteFlashMessage($object)
            );
        }
    
        return $this->redirect($this->getListRoute());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-13
      • 2016-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多