35

同じクラスの別のプロパティに依存するモデル クラスのプロパティを検証することは可能ですか?

たとえば、次のクラスがあります。

class Conference
{
    /** $startDate datetime */
    protected $startDate;

    /** $endDate datetime */
    protected $endDate;
}

そして、Symfony 2.0 が検証することを望んでい$startDateます$endDate

これは注釈によって可能ですか、それとも手動で行う必要がありますか?

4

6 に答える 6

40

Symfony 2.4以降では、の検証制約を使用して必要なものを達成することもできます。これが最も簡単な方法だと思います。確かに Callback 制約より便利です。

検証制約アノテーションを使用してモデル クラスを更新する方法の例を次に示します。

use Symfony\Component\Validator\Constraints as Assert;


class Conference
{
    /**
     * @var \DateTime
     *
     * @Assert\Expression(
     *     "this.startDate <= this.endDate",
     *     message="Start date should be less or equal to end date!"
     * )
     */
    protected $startDate;

    /**
     * @var \DateTime
     *
     * @Assert\Expression(
     *     "this.endDate >= this.startDate",
     *     message="End date should be greater or equal to start date!"
     * )
     */
    protected $endDate;
}

プロジェクト構成で注釈を有効にすることを忘れないでください。

式の構文を使用すると、さらに複雑な検証をいつでも実行できます。

于 2014-10-24T19:02:37.207 に答える
21

はい、コールバックバリデーターで: http://symfony.com/doc/current/reference/constraints/Callback.html

symfony 2.0 の場合:

use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\ExecutionContext;

/**
 * @Assert\Callback(methods={"isDateValid"})
 */
class Conference
{

    // Properties, getter, setter ...

    public function isDateValid(ExecutionContext $context)
    {
        if ($this->startDate->getTimestamp() > $this->endDate->getTimestamp()) {
                $propertyPath = $context->getPropertyPath() . '.startDate';
                $context->setPropertyPath($propertyPath);
                $context->addViolation('The starting date must be anterior than the ending date !', array(), null);
        }
    }
}

symfony マスター バージョン:

    public function isDateValid(ExecutionContext $context)
    {
        if ($this->startDate->getTimestamp() > $this->endDate->getTimestamp()) {
            $context->addViolationAtSubPath('startDate', 'The starting date must be anterior than the ending date !', array(), null);
        }
    }

ここでは、startDate フィールドにエラー メッセージを表示することを選択しています。

于 2012-09-04T09:45:36.127 に答える
10

別の方法 (少なくともSymfony 2.3 以降) は、 simple を使用すること@Assert\IsTrueです:

class Conference
{
    //...

    /**
     * @Assert\IsTrue(message = "Startime should be lesser than EndTime")
     */
    public function isStartBeforeEnd()
    {
        return $this->getStartDate() <= $this->getEndDate;
    }

    //...
}

参考として、ドキュメント.

于 2015-03-12T14:11:16.773 に答える
9

バージョン 2.4からさらにシンプルになりました。このメソッドをクラスに追加するだけです。

use Symfony\Component\Validator\Context\ExecutionContextInterface;

/**
 * @Assert\Callback
 */
public function isStartBeforeEnd(ExecutionContextInterface $context)
{
    if ($this->getStartDate() <= $this->getEndDate()) {
        $context->buildViolation('The start date must be prior to the end date.')
                ->atPath('startDate')
                ->addViolation();
    }
}

このbuildViolationメソッドは、制約の構成に役立つ他のいくつかのメソッド (パラメーターや変換など) を持つビルダーを返します。

于 2014-09-02T21:25:35.147 に答える