2015-02-10 5 views
5

में संग्रह प्रारंभ करने का उपयोग क्या है मैं सिम्फनी के साथ सिद्धांत का उपयोग कर रहा हूं और इकाई जनरेटर इकाई के कन्स्ट्रक्टर में संग्रह प्रारंभ करता है। उदाहरण के लिए:कन्स्ट्रक्टर

/** 
* @var MyProject\MyBundle\Entity\Foo 
* 
* @ORM\ManyToMany(targetEntity="MyProject\MyBundle\Entity\Foo") 
*/ 
private $foos; 

public function __construct() { 
    $this->foos = new \Doctrine\Common\Collections\ArrayCollection(); 
} 

और मैं Doctrine's best practices कि ... यह एक अच्छा अभ्यास ऐसा करने के लिए है में पढ़ सकते हैं।

लेकिन सवाल यह है: ब्याज क्या है?

अगर मैं इस लाइन को कन्स्ट्रक्टर में हटा देता हूं तो मुझे कोई बदलाव नहीं दिखता है। मुझे लगता है कि यह आलसी लोड हो गया है, लेकिन कन्स्ट्रक्टर लिखने के लिए समय निकालने के लिए काफी महत्वपूर्ण प्रदर्शन ड्रॉप है (app/console doctrine:generate:entities कमांड कन्स्ट्रक्टर को नए एरे कोलेक्शन के साथ फ़ीड नहीं करता है अगर कन्स्ट्रक्टर पहले से मौजूद है, तो मुझे इसे मैन्युअल रूप से करना है)।

और यदि यह वास्तव में करना बेहतर है, तो क्या मुझे इसे सभी संबंधों के लिए करना चाहिए या केवल nullable=false एक करना चाहिए?

Wheel (नल नहीं) और Passenger (नल) के साथ OneToMany साथ OneToMany में इकाई Car कल्पना कीजिए। क्या मुझे केवल $wheels या दोनों प्रारंभ करना चाहिए? और क्यों ?

+0

मान लीजिए कि आपकी इकाई का उपयोग करने वाले क्लाइंट को शून्य तत्वों के लिए गिनती के बजाय शून्य मान की जांच करनी चाहिए, और कुछ अन्य सिद्धांत सामग्री और व्यवहार जिन्हें मैं अनदेखा करता हूं .... – Matteo

उत्तर

2

सिद्धांत संस्थाएं केवल साधारण वस्तुएं हैं। जब आप डेटाबेस से किसी इकाई को लोड करते हैं, तो सिद्धांत कभी भी कन्स्ट्रक्टर को कॉल नहीं करता है और आपके संग्रह को सेट करने का ख्याल रखता है। वास्तव में आलसी लोडिंग नहीं है लेकिन सिद्धांत यह सुनिश्चित करेगा कि संग्रह बनाए गए हैं। यही कारण है कि आपने कोई अंतर नहीं देखा है।

हालांकि, यदि आप एक नया उदाहरण बनाने के लिए "नई इकाई()" का उपयोग करते हैं तो आपके संग्रह को आरंभ करने के लिए कन्स्ट्रक्टर की आवश्यकता होती है। यदि आपके संग्रह प्रारंभ नहीं किए गए हैं तो आपके ऐड विधियां विफल हो जाएंगी। अपने तरीके प्राप्त करने का भी उल्लेख नहीं है।

संबंधों के बावजूद हमेशा अपने सभी संग्रह आरंभ करें। एक बार फिर, यदि आप नहीं करते हैं तो उन्हें एक्सेस करने का कोई प्रयास विफल हो जाएगा।

यह "सर्वोत्तम प्रथाओं" की "आवश्यक प्रथाओं" नहीं है।

+0

"विफल" से कहां से क्या मतलब है? मैंने '$ कार = नई कार() की कोशिश की; $ व्हील = नया व्हील(); $ कार-> addWheel ($ पहिया); var_dump ($ car-> getWheels()); ', दोनों रचनाकार खाली के साथ। मुझे किसी प्रकार की त्रुटि दिखाई नहीं दे रही है, और var_dump मुझे '$ व्हील' अपेक्षित दिखाता है। – Blacksad

+1

अपनी कार इकाई को दिखाते हुए अपना प्रश्न अपडेट करें, खासकर जहां आप पहियों और addWheel/getWheels विधियों की घोषणा करते हैं। – Cerad

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