Symfony Validator @GroupSequence在后续对象中不起作用

时间:2018-06-13 08:54:54

标签: php symfony4 symfony-validator

我正在尝试使用\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());
    }
}

0 个答案:

没有答案