2012-07-23 11 views
7

के लिए आवश्यकता को हटाने के लिए FOSUserBundle ओवरराइड मैपिंग FOSUserBundle में उपयोगकर्ता नाम की आवश्यकता को हटाना चाहता हूं। मेरे उपयोगकर्ता केवल एक ईमेल पते का उपयोग करके लॉगिन करेंगे और मैंने उपयोगकर्ता इकाई के हिस्से के रूप में वास्तविक नाम फ़ील्ड जोड़े हैं। मुझे एहसास हुआ कि मैं पूरी मानचित्रण फिर से करना के रूप में वर्णित here. मुझे लगता है कि मैं इसे ठीक से किया है की जरूरत है लेकिन जब मैं पंजीकरण फार्म सबमिट करने का प्रयास मैं त्रुटि मिलती है: सिद्धांत द्वारा मैपउपयोगकर्ता नाम

"केवल फ़ील्ड नाम हो सकता है विशिष्टता के लिए मान्य। "

अजीब बात यह है कि मैंने उपयोगकर्ता इकाई में किसी भी चीज़ के लिए एक अद्वितीय बाधा डालने की कोशिश नहीं की है।

<?php 
     // src/MyApp/UserBundle/Entity/User.php 

     namespace MyApp\UserBundle\Entity; 

     use FOS\UserBundle\Model\User as BaseUser; 
     use Doctrine\ORM\Mapping as ORM; 
     use Symfony\Component\Validator\Constraints as Assert; 

     /** 
     * @ORM\Entity 
     * @ORM\Table(name="depbook_user") 
     */ 
     class User extends BaseUser 
     { 
      /** 
      * @ORM\Id 
      * @ORM\Column(type="integer") 
      * @ORM\GeneratedValue(strategy="AUTO") 
      */ 
      protected $id; 

      /** 
      * @ORM\Column(type="string", length=255) 
      * 
      * @Assert\NotBlank(message="Please enter your first name.", groups={"Registration", "Profile"}) 
      * @Assert\MaxLength(limit="255", message="The name is too long.", groups={"Registration", "Profile"}) 
      */ 
      protected $firstName; 

      /** 
      * @ORM\Column(type="string", length=255) 
      * 
      * @Assert\NotBlank(message="Please enter your last name.", groups={"Registration", "Profile"}) 
      * @Assert\MaxLength(limit="255", message="The name is too long.", groups={"Registration", "Profile"}) 
      */ 
      protected $lastName; 

      /** 
      * @ORM\Column(type="string", length=255) 
      * 
      * @Assert\NotBlank(message="Please enter your email address.", groups={"Registration", "Profile"}) 
      * @Assert\MaxLength(limit="255", message="The name is too long.", groups={"Registration", "Profile"}) 
      * @Assert\Email(groups={"Registration"}) 
      */ 
      protected $email; 

      /** 
      * @ORM\Column(type="string", length=255, name="email_canonical", unique=true) 
      */ 
      protected $emailCanonical; 

      /** 
      * @ORM\Column(type="boolean") 
      */ 
      protected $enabled; 

      /** 
      * @ORM\Column(type="string") 
      */ 
      protected $salt; 

      /** 
      * @ORM\Column(type="string") 
      */ 
      protected $password; 

      /** 
      * @ORM\Column(type="datetime", nullable=true, name="last_login") 
      */ 
      protected $lastLogin; 

      /** 
      * @ORM\Column(type="boolean") 
      */ 
      protected $locked; 

      /** 
      * @ORM\Column(type="boolean") 
      */ 
      protected $expired; 

      /** 
      * @ORM\Column(type="datetime", nullable=true, name="expires_at") 
      */ 
      protected $expiresAt; 

      /** 
      * @ORM\Column(type="string", nullable=true, name="confirmation_token") 
      */ 
      protected $confirmationToken; 

      /** 
      * @ORM\Column(type="datetime", nullable=true, name="password_requested_at") 
      */ 
      protected $passwordRequestedAt; 

      /** 
      * @ORM\Column(type="array") 
      */ 
      protected $roles; 

      /** 
      * @ORM\Column(type="boolean", name="credentials_expired") 
      */ 
      protected $credentialsExpired; 

      /** 
      * @ORM\Column(type="datetime", nullable=true, name="credentials_expired_at") 
      */ 
      protected $credentialsExpiredAt; 

      public function __construct() 
      { 
       parent::__construct(); 
       // your own logic 
      } 

      /** 
      * @return string 
      */ 
      public function getFirstName() 
      { 
       return $this->firstName; 
      } 

      /** 
      * @return string 
      */ 
      public function getLastName() 
      { 
       return $this->lastName; 
      } 

      /** 
      * Sets the first name. 
      * 
      * @param string $firstname 
      * 
      * @return User 
      */ 
      public function setFirstName($firstname) 
      { 
       $this->firstName = $firstname; 

       return $this; 
      } 

       /** 
      * Sets the last name. 
      * 
      * @param string $lastname 
      * 
      * @return User 
      */ 
      public function setLastName($lastname) 
      { 
       $this->lastName = $lastname; 

       return $this; 


     } 
    } 

मैं इस बारे में विभिन्न सुझावों को देखा है लेकिन सुझाव से कोई भी मेरे लिए काम करने लगते हैं:

यहाँ मेरी पूर्ण उपयोगकर्ता इकाई फ़ाइल है। FOSUserBundle दस्तावेज़ बहुत ही सामान्य अनुरोध होने के बारे में बहुत दुर्लभ हैं।

उत्तर

15

मुझे लगता है कि इस बारे में जाने का सबसे आसान तरीका बंडल को छोड़ना है और अपने उपयोगकर्ता वर्ग को ईमेल पते के बराबर उपयोगकर्ता नाम रखने के लिए सेट करना है।

setEmail() विधि अधिभावी भी $email पैरामीटर के लिए $username गुण सेट करने के लिए ऐसा करें और setEmailCanonical() भी $emailCanonical को $usernameCanonical स्थापित करने के लिए।

public function setEmail($email){ 
    $this->email = $email; 
    $this->username = $email; 
} 

public function setEmailCanonical($emailCanonical){ 
    $this->emailCanonical = $emailCanonical; 
    $this->usernameCanonical = $emailCanonical; 
} 

आप सभी अन्य करने के लिए की तुलना में इस से संबंधित अर्थ विज्ञान है होगा। अपने फॉर्म लेबल को डिफ़ॉल्ट उपयोगकर्ता नाम लेबल के बजाय ई-मेल पढ़ने की तरह। आप अनुवाद फ़ाइलों को ओवरराइड करके ऐसा कर सकते हैं। मैं इसे आपके पास छोड़ दूंगा (या कोई और) क्योंकि यह आपके लिए भी आवश्यक नहीं हो सकता है।

इस रणनीति के साथ आपके डेटाबेस में अनावश्यक डेटा होगा लेकिन यह आपको बहुत से रीमेपिंग सिरदर्द बचाएगा।

+0

मैं बस फॉस्बंडल को खुश रखने के लिए यादृच्छिक उपयोगकर्ता नाम सेट करने पर विचार कर रहा था - लेकिन ईमेल सेट करना बहुत अधिक समझ में आता है! सरल, और सुरुचिपूर्ण समाधान! – Prathap

+5

आप 'उपयोगकर्ता नाम' (बंडल के कोड में परिवर्तन के मामले में) सेट करने के बाद 'parent :: setEmail ($ ईमेल) 'भी कॉल कर सकते हैं। मूल विधि भी 'इसे वापस लौटाती है;', जो विधियों को श्रृंखलाबद्ध बनाती है। – Brewal

2

यदि आप सिद्धांत 2 का उपयोग कर रहे हैं, तो आप अपने तर्क को कॉलबैक के अंदर रखने के लिए लाइफ साइकिल ईवेंट का उपयोग कर सकते हैं।

http://docs.doctrine-project.org/en/2.0.x/reference/events.html

/** 
* @ORM\PreUpdate() 
* @ORM\PrePersist() 
*/ 
public function setUsernameToEmail() 
{ 
    $this->username = $this->email; 
    $this->usernameCanonical = $this->emailCanonical; 
} 
+6

जीवन चक्र घटनाएं लगातार संचालन पर ट्रिगर होती हैं। फॉर्म सत्यापन अभी भी खाली उपयोगकर्ता नाम के बारे में चेतावनी देगा। – eDoV

1

जब मैं ईमेल दर्ज करने के लिए (इस प्रकार FOSUserBundle में वैकल्पिक ईमेल बनाने) उपयोगकर्ताओं की आवश्यकता नहीं करना चाहता था, मैं Symfony 2.7 + FOSUser + SonataUser + SonataAdmin का उपयोग करें।

उसी समय मुझे सिस्टम में अद्वितीय होने के लिए ईमेल दर्ज करने की आवश्यकता थी। तो उपयोगकर्ता 2 विकल्प हैं जब दर्ज की: ईमेल खाली

  • एक अद्वितीय ईमेल प्रदान करें

    1. छोड़ दो, कि इस प्रणाली

    नीचे में अभी तक नहीं है मेरे समाधान की उम्मीद के रूप में काम करता है कि (मैं डॉन 'है टी यह सबसे साफ होने का दावा नहीं करता है, लेकिन उम्मीद है कि यह आपको एक समान कार्य को पूरा करने का तरीका दिखाएगा)

    1) इकाई/उपयोगकर्ता में परिवर्तन।php

    namespace AppBundle\Entity; 
    
    use Sonata\UserBundle\Entity\BaseUser as BaseUser; 
    use Doctrine\ORM\Mapping as ORM; 
    
    
    /** 
    * @ORM\Entity 
    * @ORM\Table(name="fos_user") 
    * 
    * 
    * @ORM\AttributeOverrides({ 
    *  @ORM\AttributeOverride(name="email", 
    *   [email protected]\Column(
    *    type = "string", 
    *    name  = "email", 
    *    nullable = true, 
    *    unique = true 
    *   ) 
    *  ), 
    *  @ORM\AttributeOverride(name="emailCanonical", 
    *   [email protected]\Column(
    *    type = "string", 
    *    name  = "email_canonical", 
    *    nullable = true, 
    *    unique = true 
    *   ) 
    *  ) 
    * }) 
    * 
    \*/ 
    class User extends BaseUser 
    { 
    

    2) निष्पादित एप्लिकेशन/कंसोल सिद्धांत: माइग्रेशन: भिन्नता & विस्थापित, डेटाबेस तालिकाओं की उम्मीद जोड़ने "डिफ़ॉल्ट शून्य" ईमेल करने के लिए और email_canonical क्षेत्रों के रूप में बदल रहे थे

    3) नहीं इससे कोई फर्क नहीं पड़ता कि मैंने क्या कोशिश की, ईमेल को नल पर सेट किया जा रहा था, लेकिन ईमेल_कोनिकल नहीं था, यह वापस लौट रहा था। मैंने मैन्युअल रूप से इसे अपने पंजीकरणफॉर्महैंडलर में NULL पर सेट करने का प्रयास किया, var_dump ने पुष्टि की कि ईमेल वास्तव में दर्ज नहीं होने पर यह वास्तव में NULL पर सेट किया गया था। लेकिन डेटाबेस FOSUser में खाली स्ट्रिंग सबमिट करेगी, जिसने मैंने ईमेल के लिए सेट की गई विशिष्ट बाधा का उल्लंघन किया था, इसलिए समाधान Entity/User.php में विधि को ओवरराइड करना था (जैसा कि इस प्रश्न के पिछले उत्तरों में चर्चा की गई है)

    // src/AppBundle/Entity/User.php 
    // ... 
    public function setEmailCanonical($emailCanonical) 
    { 
        // when email is empty, force canonical to NULL 
        // for some reason by default "" empty string is inserted 
        $this->emailCanonical = $this->getEmail(); 
    } 
    

    4) मेरे मामले में FOSUserBundle (या सोनाटाउसरबंडल) के लिए सत्यापन बदलें, ताकि उसे ईमेल सेट करने की आवश्यकता न हो। (मैंने बस हटा दिया है .. validation.xml से अब ईमेल पर लागू नहीं किए गए हैं)

    इन 2 फ़ाइलों को अपनी कॉन्फ़िगर/सत्यापन/निर्देशिका में कॉपी करें (सोनाटाउसर + एफओएसयूसर के लिए यह है: एप्लिकेशन/सोनाटा/उपयोगकर्ता बंडल/संसाधन)

    1. विक्रेता/friendsofsymfony/उपयोगकर्ता के बंडल/FOS/UserBundle/संसाधन/config/भंडारण-मान्यता/orm.xml
    2. पथ ऊपर
    3. , config/सत्यापन/orm.xml

    नाम बदलें " पंजीकरण "उन फ़ाइलों में समूह को अपने नाम पर, जैसे" myRegistration "।

    config.yml में fos_user पर अपना नया सत्यापन_समूह बांधें। यदि सोनाटा उपयोगकर्ता का उपयोग करना है, तो यह है:

    sonata_user: 
        profile: 
         register: 
          form: 
           ... 
           validation_groups: 
           - myRegistration 
           - Default 
    

    मज़े करें।

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