2012-05-09 13 views
5

GitHubがリポジトリの削除を処理する方法と同様のバリデータを作成したいと思います。削除を確認するには、私はレポ名を入力する必要があります。ここでは、エンティティプロパティ "name"を入力して削除を確認します。私は制約に名前を渡す必要があるか、何らかの方法でアクセスする必要があります。どうすればいいですか?Symfony 2の引数/パラメータを使用したカスタムバリデータ/制約

答えて

2

あなたは確かにそれを行うためにバリデータの制約を使用することができます。

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

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()); 
関連する問題