2013-04-03 8 views

答えて

5

私はそれも必要でした。 フル例の下に見つけてください:

エンティティを:

<?php 
namespace AppBundle\Entity\MarketPlace; 

use Doctrine\ORM\Mapping AS ORM; 
use Gedmo\Mapping\Annotation as Gedmo; 
use AppBundle\Model\BaseCategoryClass as BaseCategory; 
use AppBundle\Validator\Constraints as FMUAssert; 

/** 
* @ORM\Entity(repositoryClass="AppBundle\Repository\MarketPlace\ProductRepository") 
* @Gedmo\Tree(type="nested") 
* @FMUAssert\UnitConstraint() 
*/ 
class Product extends BaseCategory 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer", length=11) 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 
} 

制約:

<?php 
namespace AppBundle\Validator\Constraints; 

use Symfony\Component\Validator\Constraint; 

/** 
* @Annotation 
*/ 
class UnitConstraint extends Constraint 
{ 
    public $message = 'La chaîne "%string%" contient un caractère non autorisé : elle ne peut contenir que des lettres et des chiffres.'; 

    public function validatedBy() 
    { 
     return 'unit_validator'; 
    } 

    public function getTargets() 
    { 
     return self::CLASS_CONSTRAINT; 
    } 
} 

制約の検証:

<?php 
namespace AppBundle\Validator\Constraints; 

use Symfony\Component\Validator\Constraint; 
use Symfony\Component\Validator\ConstraintValidator; 

class UnitConstraintValidator extends ConstraintValidator 
{ 
    public function validate($entity, Constraint $constraint) 
    { 
     exit(var_dump(get_class($entity))); 
     $this->context->addViolation($constraint->message, array('%string%' => $value)); 
    } 
} 

、サービスとしての宣言:

services: 
    unit_validator: 
     class: %unit_validator.class% 
     tags: 
      - { name: validator.constraint_validator, alias: unit_validator } 

私が入れたexit vardumpはエンティティクラス名を取得していますが、動作しています!あなたは、プロパティバリデータを持っている場合場合

+0

素晴らしい!ちょっとしたことがあります:var_dumpの代わりに 'dump'を使うこともできます。それは非常にきれいにフォーマットされ、スタイリングされた出力を示しています。 – cezar

7

はい、方法があります。 Class constraint validatorには、スコープ内のエンティティ全体があります。

+1

ありがとうございました!ドキュメンテーションはやや不明瞭だったので、私はそれをキャッチしなかった。 –

+0

@ EirikA.Johansen、例を挙げてください。 Symfonyの例で説明したのと同じことをしようとしていますが、成功しません。より詳細な例が完璧です。 –

0

Eyとを、うまくそれはあなたが実体を検証する方法によって異なります。たとえば、Formを介してエンティティを検証しているため、ConstraintValidatorでエンティティを取得するには、コンテキストルートを取得してフォームからデータを取得するだけです。

/** 
* @Annotation 
*/ 
class ValidDnieValidator extends ConstraintValidator 
{ 

    public function validate($value, Constraint $constraint) 
    { 

     $user = $this->context->getRoot()->getData(); 
関連する問題