2013-04-03 13 views

Antwort

5

Ich war auch in der Notwendigkeit. Hier finden Sie ein vollständiges Beispiel:

Entität:

<?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; 
} 

Die Einschränkung:

<?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; 
    } 
} 

Die Einschränkung Validator:

<?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)); 
    } 
} 

Und die Erklärung als Dienstleistung:

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

Der Ausgang vardump, den ich gesetzt habe, holt mich den Entitätsklassennamen, es funktioniert!

+0

Großartig! Nur eine kleine Bemerkung: Sie könnten auch 'dump' anstelle von' var_dump' verwenden. Es zeigt die Ausgabe sehr schön formatiert und gestylt. – cezar

7

Ja, es gibt einen Weg. Class constraint validator hat eine vollständige Entität im Umfang.

+1

Vielen Dank! Die Dokumentation war etwas unklar, also habe ich das nicht zitiert. –

+0

@ EirikA.Johansen, könnten Sie bitte ein Beispiel geben? Ich versuche dasselbe zu tun, wie im Symfony-Beispiel beschrieben, aber ohne Erfolg. Ein detaillierteres Beispiel wird perfekt sein. –

0

Ey, gut es hängt davon ab, wie Sie sich das Unternehmen zu validieren. Zum Beispiel validiere ich meine Entität über ein Formular, um die Entität im ConstraintValidator zu erhalten, muss ich nur den Kontextstamm abrufen und die Daten von meinem Formular abrufen:

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

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

     $user = $this->context->getRoot()->getData(); 
Verwandte Themen