4

次のように、いくつかのカスタムバリデーターを持つエンティティがあります。

use Digital\ApplicationBundle\Validator\Constraints\ConstrainsUsername;
use Digital\ApplicationBundle\Validator\Constraints\ConstrainsProduct;
use Digital\ApplicationBundle\Validator\Constraints\ConstrainsGiftValid;

/**
 * @DigitalAssert\ConstrainsGiftValid
 */
class Gift
{

/**
 * @DigitalAssert\ConstrainsUsername
 */
private $username;

/**
 * @DigitalAssert\ConstrainsProduct
 */
private $productName;
[...]

私の質問は、チェックの順序をどのように設定できるかです。

最初にプロパティを検証したいと思います。プロパティが有効な場合は、これら2つのプロパティが「一緒に」許可されているかどうかを確認します。

したがって、私の場合はバリデーターの特定の順序が必要です。

これをどのように達成できますか?

現在の問題は、クラスの検証'ConstrainsGiftValid'がそれらの前に開始されることです;S

どんな助けでも大歓迎です。

4

2 に答える 2

1

一緒に実行するかどうかを確認するには、カスタム検証制約を作成する必要$usernameがあります$productName

バリデーターの特定の順序が必要で、コードの後半でこれら2つのフィールドの検証を再利用したい場合は、次のようにする必要があります。

1{usernameandproductName}のフォームタイプを作成します。

2そのformTypeに検証ルールを適用します。検証の順序を試してみたい場合は、この特定のケースでフォーム全体に制約を適用する必要があります。したがって、必要な場合にのみ、必要な順序でエラーをスローできます。

3あなたは最終的にあなたformTypeの中にそれを埋め込むことができますGiftFormType。埋め込みフォームを検証するには、 Valid制約またはsetcascade_validationオプションを使用することを忘れないでください。true

于 2013-02-11T23:18:48.717 に答える
1

OK、1つの制約ですべてを渡すことは機能しました。

これには、特定のプロパティへのバインドエラー、およびさまざまな障害に対するさまざまなメッセージのエラーが含まれます。

public function isValid($gift, Constraint $constraint)
{

    // Validate product.
    /** @var $product Product */
    $product = $this->em->getRepository('DigitalApplicationBundle:Shop\Product')->findOneBy(array('name' => $gift->getProductName()));
    if (!$product instanceof Product) {

        $this->context->addViolationAtSubPath('username', $constraint->messageProduct, array('%string%' => $gift->getProductName()), null);
        return false;

    }

    // Validate user.
    /** @var $user User */
    $user = $this->em->getRepository('DigitalUserBundle:User')->findOneBy(array('username' => $gift->getUsername()));
    if (!$user instanceof User) {

        $this->context->addViolationAtSubPath('username', $constraint->messageUser, array('%string%' => $gift->getUsername()), null);
        return false;
    }


    // Gift correct type of the item!
    if (($product->getType() != 0) && ($user->getGender() !== $product->getType())) {

        $this->context->addViolationAtSubPath('username', $constraint->messageType, array('%string%' => $gift->getProductName()), null);
        return false;

    }

    // If already owning this product.
    foreach ($user->getWardrobe()->getProducts() as $wardrobeProduct) {
        if ($product == $wardrobeProduct) {

            $this->context->addViolationAtSubPath('username', $constraint->message, array('%string%' => $gift->getProductName(), '%user%' => $gift->getUsername()), null);
            return false;
        }
    }

    return true;
}
于 2013-02-12T00:19:52.340 に答える