5

GitHub がリポジトリの削除を処理する方法と同様のバリデーターを作成したいと考えています。削除を確認するには、レポ名を入力する必要があります。ここでは、エンティティ プロパティ「名前」を入力して削除を確認します。名前を制約に渡すか、何らかの方法でアクセスする必要がありますが、どうすればよいですか?

4

1 に答える 1

2

実際にバリデータ制約を使用してそれを行うことができます:

1: 削除フォームを作成します (直接またはタイプを使用):

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

comparisonName2: パブリック プロパティをエンティティに追加します。(またはプロキシ オブジェクトを使用)、上記の対応するフォーム フィールドにマップされます。

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());
于 2012-05-21T09:07:45.857 に答える