2014-02-19 45 views
7

在我的Symfony 2(2.4.2)應用程序中,有一個由3個字段組成的表單類型。如果某些字段在Symfony表單中爲空,則一個字段不應爲空

我想驗證是這樣的:如果field Afield B是空白,field C不應該是空白的。這意味着至少有一個字段應該接收一些數據。

目前,我檢查控制器中收到的數據。有沒有更好的方法來做到這一點?

+0

皮卡丘:DDDDDD – Qwertie

回答

12

與編寫自定義驗證器相比,還有更簡單的解決方案。最簡單的是大概的表達約束:

class MyEntity 
{ 
    private $fieldA; 

    private $fieldB; 

    /** 
    * @Assert\Expression(
    *  expression="this.fieldA != '' || this.fieldB != '' || value != ''", 
    *  message="Either field A or field B or field C must be set" 
    *) 
    */ 
    private $fieldC; 
} 

您還可以添加一個驗證方法類,並與回調約束標註爲:

/** 
* @Assert\Callback 
*/ 
public function validateFields(ExecutionContextInterface $context) 
{ 
    if ('' === $this->fieldA && '' === $this->fieldB && '' === $this->fieldC) { 
     $context->addViolation('At least one of the fields must be filled'); 
    } 
} 

的方法將在驗證過程中所執行的的類。

+1

我認爲這個答案更好,更簡單。 – pikachu0

3

這可能是Custom Validation Constraint的用例。我沒有使用它,但基本上你創建了一個Constraint和一個Validator。然後,您在config/validation.yml中指定您的Constraint

Your\Bundle\Entity\YourEntity: 
    constraints: 
     - Your\BundleValidator\Constraints\YourConstraint: ~ 

實際驗證是由您的Validator完成的。你可以告訴Symfony的整個實體傳遞到您的validate方法來訪問多個字段有:

public function getTargets() 
{ 
    return self::CLASS_CONSTRAINT; 
} 

而且你validate

public function validate($entity, Constraint $constraint) 
{ 
    // Do whatever validation you need 
    // You can specify an error message inside your Constraint 
    if (/* $entity->getFieldA(), ->getFieldB(), ->getFieldC() ... */) { 
     $this->context->addViolationAt(
      'foo', 
      $constraint->message, 
      array(), 
      null 
     ); 
    } 
} 
+0

工程就像一個魅力!謝謝! – pikachu0

0

你可以用Group Sequence Providers做到這一點,例如:

use Symfony\Component\Validator\GroupSequenceProviderInterface; 

/** 
* @Assert\GroupSequenceProvider 
*/ 
class MyObject implements GroupSequenceProviderInterface 
{ 
    /** 
    * @Assert\NotBlank(groups={"OptionA"}) 
    */ 
    private $fieldA; 

    /** 
    * @Assert\NotBlank(groups={"OptionA"}) 
    */ 
    private $fieldB; 

    /** 
    * @Assert\NotBlank(groups={"OptionB"}) 
    */ 
    private $fieldC; 

    public function getGroupSequence() 
    { 
     $groups = array('MyObject'); 

     if ($this->fieldA == null && $this->fieldB == null) { 
      $groups[] = 'OptionB'; 
     } else { 
      $groups[] = 'OptionA'; 
     } 

     return $groups; 
    } 
} 

未經測試,但我認爲它會工作

相關問題