2011-09-29 17 views
5

मैं कुछ ऐसे फ़ील्ड के साथ एक फॉर्म को सत्यापित करने की कोशिश कर रहा हूं, जो अद्वितीय होने की आवश्यकता है - उपयोगकर्ता नाम और ईमेल पता। अगर मैं फॉर्म जमा करता हूं तो मुझे डेटाबेस त्रुटि मिलती है। मैं एक सत्यापनकर्ता का उपयोग करना चाहता हूं जैसे मैंने बाकी सब कुछ के लिए किया - अभी मैं ऑब्जेक्ट में कस्टम गेटर्स और isvalidUsername फ़ंक्शंस का उपयोग करने की कोशिश कर रहा हूं और मुझे यकीन नहीं है कि ऑब्जेक्ट में इकाई प्रबंधक का उपयोग करना यह करने का सबसे अच्छा तरीका है । Heres क्या मैं अब तक के साथ काम कर रहा हूँ ...सिम्फनी 2 अद्वितीय सत्यापनकर्ता

Frontend\UserBundle\Entity\User: 
     properties: 
      email: 
        - NotBlank: ~ 
        - Email: ~ 
     username: 
      - NotBlank: ~ 
     getters: 
       validUsername: 
        - "True": { message: "Duplicate User detected. Please use a different username." } 
       validEmail: 
        - "True": { message: "Duplicate email detected. Please use a different email." } 

वहाँ fosuserbundle में अद्वितीय प्रमाणकों में निर्माण कर रहे हैं, लेकिन मैं उन्हें कैसे उपयोग करने के लिए यह पता लगाने की नहीं कर पाए हैं।

उत्तर

1

सबसे पहले, मैं आपको FOSUserBundle का उपयोग करने की सलाह दूंगा। यह काफी लचीला है और आप स्वयं को कुछ समय बचा सकते हैं जब आप सूक्ष्म बग फिक्स करके और परीक्षण कर सकते हैं यदि सब कुछ वास्तव में इरादे से काम करता है।

वैसे भी, यदि आप वास्तव में इसे स्वयं बनाना चाहते हैं, तो आप कम से कम उल्लिखित बंडल द्वारा प्रेरित कर सकते हैं। वे custom validator परिभाषित करते हैं और UserManager (validateUnique) में विशिष्टता की जांच करते हैं। इसके अतिरिक्त, आपको service के रूप में इसे UserManager प्रदान करने के लिए इसे कन्स्ट्रक्टर इंजेक्शन के माध्यम से पंजीकृत करना होगा। फिर आप इसे सामान्य class validator के रूप में उपयोग करते हैं।

5

मुझे पता है कि यह एक पुराना सवाल है लेकिन मुझे अभी इसे बाहर करना है इसलिए मैंने सोचा कि मैं अपना समाधान साझा करूंगा।

<?php 
namespace MyCorp\CorpBundle\Entity; 
use Symfony\Component\Validator\Mapping\ClassMetadata; 
use Symfony\Component\Validator\Constraints\NotBlank; 
use Symfony\Component\Validator\Constraints\Email; 
use Symfony\Component\Security\Core\User\UserInterface; 
use Symfony\Component\Security\Core\User\AdvancedUserInterface; 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; 

/** User - Represent a User object */ 
class User implements AdvancedUserInterface { 

    /** @var integer $id */ 
    private $id; 

    /** @var string $email */ 
    private $email; 

    /** Constructor, Getters, Setters etc... */ 

    /** Set a list of rules to use when validating an instance of this Class 
     @param Symfony\Component\Validator\Mapping\ClassMetadata $metadata */ 
    public static function loadValidatorMetadata(ClassMetadata $metadata) { 

     $metadata->addPropertyConstraint('email', new MaxLength(255)); 
     $metadata->addPropertyConstraint('email', new NotBlank()); 
     $metadata->addPropertyConstraint('email', new Email()); 

     $metadata->addConstraint(new UniqueEntity(array(
      "fields" => "email", 
      "message" => "This email address is already in use") 
     )); 

    } 

} 

आप मैं मॉडल अपने आप में मेरी मान्यता को परिभाषित देख सकते हैं:

मैं तो यह मेरा मार्गदर्शन दृष्टिकोण है मेरे उपयोगकर्ताओं को संभालने के लिए कोई बंडल उपयोग नहीं करना चाहते। आपको वैधता लोड करने के लिए सिम्फनी loadValidatorMetadata पर कॉल करेगा।

+0

यह मेरे लिए काम करता था। हो सकता है कि इस मामले में FOSUserBundle का उपयोग करना बेहतर हो, लेकिन मैं बस उस सब के साथ गड़बड़ किए बिना किसी विशिष्टता वैधता को थप्पड़ मारना चाहता था, और यह चाल थी। धन्यवाद। –

+0

मुझे पता चला है कि इस समाधान के साथ क्या समस्या है: यदि आप मौजूदा उपयोगकर्ता रिकॉर्ड को अपडेट करने का प्रयास करते हैं, तो आपको एक त्रुटि मिलती है जो कहती है कि ईमेल पता पहले से उपयोग में है, जो निश्चित रूप से नहीं होना चाहिए। –

+0

यह समाधान मेरे लिए, संपादन और सभी के लिए काम कर रहा है, इसलिए मुझे यकीन नहीं है कि क्या हो रहा है। मैं मंगलवार तक अपना कोड नहीं देख सकता लेकिन मैं देखूंगा कि क्या मैं कुछ भी देख सकता हूं – OrganicPanda

0

UniqueEntity प्रमाणीकरण बाधा है यह सुनिश्चित करने के लिए कि उपयोगकर्ता किसी विशेष संपत्ति के लिए अद्वितीय मूल्य प्रदान करता है।

कृपया सिम्फनी के विभिन्न प्रारूपों का उपयोग करके उदाहरणों के लिए documentation देखें। एनोटेशन का उपयोग करके यहां एक उदाहरण दिया गया है:

// Acme/UserBundle/Entity/Author.php 
namespace Acme\UserBundle\Entity; 

use Symfony\Component\Validator\Constraints as Assert; 
use Doctrine\ORM\Mapping as ORM; 

// DON'T forget this use statement!!! 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; 

/** 
* @ORM\Entity 
* @UniqueEntity("email") 
*/ 
class Author 
{ 
    /** 
    * @var string $email 
    * 
    * @ORM\Column(name="email", type="string", length=255, unique=true) 
    * @Assert\Email() 
    */ 
    protected $email; 

    // ... 
}