我正在尝试使用\Symfony\Component\Validator\Constraints\GroupSequence
,但似乎无效。它仅适用于根对象,忽略后续对象的注释。我尝试了不同的组合组合,以不同的顺序使用它们。使用GroupSequenceProviderInterface
。如何解决它?
以下代码的结果:
“App \ A @ A”
“App \ A @ B”
“App \ B @ B”
“App \ A @ AllValid”
“”
app.php
<?php
/** @var ClassLoader $loader */
use Composer\Autoload\ClassLoader;
use Doctrine\Common\Annotations\AnnotationRegistry;
$loader = require __DIR__.'/vendor/autoload.php';
AnnotationRegistry::registerLoader([$loader, 'loadClass']);
$validator = \Symfony\Component\Validator\Validation::createValidatorBuilder()->enableAnnotationMapping()->getValidator();
$foo = new \App\A();
$foo->b = new \App\B();
$foo->b->c = new \App\C();
$violations = $validator->validate($foo);
dump( (string)$violations);
a.php只会
<?php
namespace App;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
/**
* @Assert\GroupSequence({"A", "B", "AllValid"})
*/
class A
{
/**
* @var B
*
* @Assert\NotBlank()
* @Assert\Type(type="\App\B", groups={"A"})
* @Assert\Valid(groups={"B"})
*/
public $b;
/**
* @Assert\Callback(groups={"A"})
* @Assert\Callback(groups={"B"})
* @Assert\Callback(groups={"C"})
* @Assert\Callback(groups={"D"})
* @Assert\Callback(groups={"AllValid"})
* @param ExecutionContextInterface $context
*/
public function validate(ExecutionContextInterface $context)
{
dump(__CLASS__ . ' @ ' . $context->getGroup());
}
}
B.php
<?php
namespace App;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
/**
* @Assert\GroupSequence({"B", "C", "AllValid"})
*/
class B
{
/**
* @var C
*
* @Assert\NotBlank()
* @Assert\Type(type="\App\C", groups={"B"})
* @Assert\Valid(groups={"C"})
*/
public $c;
/**
* @Assert\Callback(groups={"A"})
* @Assert\Callback(groups={"B"})
* @Assert\Callback(groups={"C"})
* @Assert\Callback(groups={"D"})
* @Assert\Callback(groups={"AllValid"})
* @param ExecutionContextInterface $context
*/
public function validate(ExecutionContextInterface $context)
{
dump(__CLASS__ . ' @ ' . $context->getGroup());
}
}
C.php
<?php
namespace App;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
/**
* @Assert\GroupSequence({"C", "D", "AllValid"})
*/
class C
{
/**
* @var D
*
* @Assert\NotBlank()
* @Assert\Type(type="\App\D", groups={"C"})
* @Assert\Valid(groups={"D"})
*/
public $d;
/**
* @Assert\Callback(groups={"A"})
* @Assert\Callback(groups={"B"})
* @Assert\Callback(groups={"C"})
* @Assert\Callback(groups={"D"})
* @Assert\Callback(groups={"AllValid"})
* @param ExecutionContextInterface $context
*/
public function validate(ExecutionContextInterface $context)
{
dump(__CLASS__ . ' @ ' . $context->getGroup());
}
}
D.php
<?php
namespace App;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
/**
* @Assert\GroupSequence({"D", "AllValid"})
*/
class D
{
/**
* @Assert\Callback(groups={"A"})
* @Assert\Callback(groups={"B"})
* @Assert\Callback(groups={"C"})
* @Assert\Callback(groups={"D"})
* @Assert\Callback(groups={"AllValid"})
* @param ExecutionContextInterface $context
*/
public function validate(ExecutionContextInterface $context)
{
dump(__CLASS__ . ' @ ' . $context->getGroup());
}
}