Symfony 2中带有参数/参数的自定义验证器/约束

时间:2012-05-09 10:31:34

标签: validation symfony

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

1 个答案:

答案 0 :(得分:2)

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

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());
相关问题