2013-04-03 7 views
8

में वर्तमान इकाई तक पहुंचें क्या वर्तमान में कस्टम बाधा वैधता में मान्य होने वाली संपत्ति की इकाई तक पहुंचने का कोई तरीका है, और यदि ऐसा है, तो कैसे? जहां तक ​​मैं देख सकता हूं, मेरे पास केवल मूल्य तक पहुंच है (और कोई भी सेवा जो मैं इंजेक्ट करने के लिए चुन सकता हूं)।कस्टम symfony2 बाधा वैधता

उत्तर

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 } 

मैंने जो एक्जिट वार्डम्प रखा है, वह मुझे इकाई वर्ग का नाम देता है, यह काम कर रहा है!

+0

बढ़िया! बस एक छोटी टिप्पणी: आप 'var_dump' के बजाय' डंप 'का भी उपयोग कर सकते हैं। यह आउटपुट को बहुत अच्छी तरह से स्वरूपित और स्टाइल दिखाता है। – cezar

7

हाँ, एक तरीका है। Class constraint validator में दायरे में एक पूरी इकाई है।

+1

धन्यवाद! दस्तावेज़ीकरण कुछ हद तक अस्पष्ट था इसलिए मैंने उस पकड़ को उद्धृत नहीं किया। –

+0

@ EirikA.Johansen, क्या आप एक उदाहरण प्रदान कर सकते हैं? मैं सिम्फनी उदाहरण में वर्णित वही काम करने की कोशिश कर रहा हूं लेकिन सफलता के बिना। एक और विस्तारित उदाहरण सही होगा। –

7

मामले में आप संपत्ति सत्यापनकर्ता है, तो आप भी ExecutionContext के माध्यम से सत्यापनकर्ता में वस्तु मान्य पहुँच सकते हैं:

http://api.symfony.com/2.8/Symfony/Component/Validator/Context/ExecutionContextInterface.html#method_getObject

class SomeValidator extends ConstraintValidator 
{ 
    public function validate($value, Constraint $constraint) 
    { 
     $object = $this->context->getObject(); 
    } 
} 
+0

यह शून्य लौटाता है। कोई विचार क्यों? –

0

Ey, अच्छी तरह से है कि यह कैसे आप इकाई सत्यापित कर रहें पर निर्भर करता है। उदाहरण के लिए, मैं एक फॉर्म के माध्यम से अपनी इकाई को मान्य कर रहा हूं, ताकि कॉन्स्ट्रेंट वैलिडेटर में इकाई प्राप्त करने के लिए मुझे केवल संदर्भ रूट प्राप्त करने की आवश्यकता हो और मेरे फॉर्म से डेटा प्राप्त हो:

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

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

     $user = $this->context->getRoot()->getData(); 
संबंधित मुद्दे