在我的Symfony 2(2.4.2)應用程序中,有一個由3個字段組成的表單類型。如果某些字段在Symfony表單中爲空,則一個字段不應爲空
我想驗證是這樣的:如果field A
和field B
是空白,field C
不應該是空白的。這意味着至少有一個字段應該接收一些數據。
目前,我檢查控制器中收到的數據。有沒有更好的方法來做到這一點?
在我的Symfony 2(2.4.2)應用程序中,有一個由3個字段組成的表單類型。如果某些字段在Symfony表單中爲空,則一個字段不應爲空
我想驗證是這樣的:如果field A
和field B
是空白,field C
不應該是空白的。這意味着至少有一個字段應該接收一些數據。
目前,我檢查控制器中收到的數據。有沒有更好的方法來做到這一點?
與編寫自定義驗證器相比,還有更簡單的解決方案。最簡單的是大概的表達約束:
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');
}
}
的方法將在驗證過程中所執行的的類。
我認爲這個答案更好,更簡單。 – pikachu0
這可能是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
);
}
}
工程就像一個魅力!謝謝! – pikachu0
你可以用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;
}
}
未經測試,但我認爲它會工作
皮卡丘:DDDDDD – Qwertie