2016-02-02 7 views
5

मैं सिम्फोनी में custom constraint बनाने 3बाधा गुण या टिककर खेल

मैं त्रुटि

बाधा अनुप्रयोग \ बंडल \ MyBundle \ सत्यापनकर्ता \ प्रतिबन्ध है \ कोड संपत्तियों पर नहीं रखा जा सकता कोशिश पर नहीं रखा जा सकता या टिककर खेल

<?php 
// vendor/app/mybundle/Validator/Constraints/Code.php 

namespace App\Bundle\MyBundle\Validator\Constraints; 

use Symfony\Component\Validator\Constraint; 


class Code extends Constraint 
{ 
    public $message = 'Error validate message!!!'; 
    public function validatedBy() 
    { 
     return 'alias_name'; 
    } 

    public function getTargets() 
    { 
     //return self::CLASS_CONSTRAINT; // error "The constraint cannot be put on properties or getters" 
     return array(self::PROPERTY_CONSTRAINT, self::CLASS_CONSTRAINT); // working, but $value is a STRING!!! 
    } 
} 

मेरे विक्रेता/ऐप्स/mybundle/सत्यापनकर्ता/प्रतिबन्ध/CodeValidator.php

<?php 
// vendor/app/mybundle/Validator/Constraints/CodeValidator.php 

namespace App\Bundle\MyBundle\Validator\Constraints; 

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

class CodeValidator extends ConstraintValidator 
{ 
    public function validate($value, Constraint $constraint) 
    { 
     $value->getId(); // this code not working, because $value is STRING!! 
     $this->context->buildViolation($constraint->message) 
      ->atPath('code') 
      ->addViolation(); 
    } 

}

जहाँ मैं एक गलती की है?

उत्तर

6

अपने बाधा में जोड़ने के लिए प्रयास करें:

/** 
* @Annotation 
* @Target({"PROPERTY", "METHOD", "ANNOTATION"}) 
*/ 

संपादित

आज सुबह, मैं एक ताजा सिम्फोनी 3 स्थापना पर अपने कार्यान्वयन की कोशिश करने का समय लगा।

इसके अलावा, अगर आप निम्नलिखित की तरह एक संपत्ति पर @AcmeAssert\Code जोड़ें:

use AppBundle\Validator\Constraints as AcmeAssert; 

// ... 

/** 
* @var string 
* @AcmeAssert\Code 
* @ORM\Column(name="code", type="string") 
*/ 
private $code; 

केवल क्षेत्र मान्य किया जाएगा, ताकि $value संपत्ति के क्षेत्र मूल्य का प्रतिनिधित्व करता।
उदाहरण के लिए, यदि आप को अपनी इकाई में $code संपत्ति पर असाइन करते हैं, जब फॉर्म सबमिट किया जाता है, तो आपके सत्यापनकर्ता का $value आपकी $code संपत्ति के फ़ील्ड मान का प्रतिनिधित्व करेगा)।

इस प्रकार है जैसे आप अपने इकाई के शीर्ष पर @AcmeAssert\Code जोड़ते हैं:

use AppBundle\Validator\Constraints as AcmeAssert; 

/** 
* Foo 
* 
* @ORM\Table(name="foo") 
* @AcmeAssert\Code 
* @ORM\Entity(repositoryClass="AppBundle\Repository\FooRepository") 
*/ 
class Foo 

फिर, $ मूल्य इच्छा अपना पूरा इकाई का प्रतिनिधित्व करता है, और आप ही टिककर खेल का उपयोग करके सभी मान्यता आप चाहते हैं कर सकते हैं।

मैं एक भंडार में अपने परीक्षण परियोजना को शामिल किया है, आप कैसे दो विकल्पों का उपयोग देखने के लिए उपयोग कर सकते हैं: sf3-constraint-test

मेरे उदाहरण में, इकाई AppBundle::Bar संपत्ति पर बाधा है, और AppBundle::Foo पर बाधा है पूरी इकाई

आशा है कि आपको इसकी आवश्यकता है!

EDIT2

आप YAML मानचित्रण में हैं, तो निम्न $value द्वारा पूर्ण वस्तु को अपने पूरे इकाई और उपयोग पर बाधा लागू करने के लिए अपने बाधा में उपयोग करें:

AppBundle\Entity\AcmeEntity: 
    constraints: 
     - App\Bundle\MyBundle\Validator\Constraints\Code: ~ 

शीर्ष पर आपके मैपिंग का

और यदि आप केवल एक संपत्ति पर बाधा लागू करना चाहते हैं, और $value का उपयोग करके फ़ील्ड के मान तक पहुंचें, तो आप कैसे रहें और $value पर अपना तर्क करें जो एक स्ट्रिंग है (इकाई संपत्ति के अनुरूप फ़ील्ड का मान मैपिंग में बाध्य), यह कुछ ऐसा है:

AppBundle\Entity\AcmeEntity: 
    properties: 
      # ... 
      code: 
       - App\Bundle\MyBundle\Validator\Constraints\Code: ~ 
+0

इससे मदद नहीं मिली :( – Neokortex

+0

मैं अपना बदलता हूं, @ चालासर फिर से दिखता हूं। कृपया – Neokortex

+0

मैंने आपकी ज़रूरत के अनुरूप बदलाव किए हैं। – chalasr

4

आप इस तरह के रूप में एक बाधा है कि केवल एक पूरी इकाई के लिए लागू किया जाना चाहिए, बनाया:

/** 
* @AppAssert\SectionCode 
*/ 
class MyEntity 
{ 
    // ... 
} 

आप अपने बाधा एक वर्ग के सदस्यों के लिए लागू करना चाहते हैं, पूरी तरह अपने getTargets() समारोह को हटा दें।

+0

@AppAssert \ sectionCode ("propertyName") के बारे में क्या है? – chalasr

+0

मुझे नहीं लगता कि –

+0

काम करेगा @ जेसन-रोमन करते मैं getTargets बदलने सार्वजनिक समारोह getTargets() \t { \t \t वापसी सरणी (स्वयं :: PROPERTY_CONSTRAINT, आत्म :: CLASS_CONSTRAINT); \t} लेकिन मान्य() विधि $ वैल्यू वैरिएबल मेरी इकाई का ऑब्जेक्ट नहीं है, स्ट्रिंग – Neokortex

संबंधित मुद्दे