2011-09-17 9 views
15

मैं एक इकाई की एक संबंधित भंडार GameRepository कहा जाता है के साथ Game कहा जाता है:एक संस्था से एक रिसोजिटरी कैसे प्राप्त करें?

/** 
* @ORM\Entity(repositoryClass="...\GameRepository") 
* @ORM\HasLifecycleCallbacks() 
*/ 
class Game { 
    /** 
    * @ORM\prePersist 
    */ 
    public function setSlugValue() { 
     $this->slug = $repo->createUniqueSlugForGame(); 
    } 
} 

prePersist विधि में, मैं यह सुनिश्चित करें कि खेल के स्लग क्षेत्र अद्वितीय है, जो एक डेटाबेस क्वेरी की आवश्यकता की जरूरत है। क्वेरी करने के लिए, मुझे EntityManager तक पहुंच की आवश्यकता है। मैं GameRepository के अंदर से EntityManager प्राप्त कर सकते हैं। तो: मैं गेम से गेम रेस्पोजिटरी कैसे प्राप्त करूं?

उत्तर

9

आप नहीं करते हैं। सिद्धांत 2 में इकाइयां इकाई प्रबंधक या भंडार के बारे में जानी जाती हैं।

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

+2

उन्होंने ऐसा क्यों करना चुना? ऐसा लगता है कि सबकुछ काफी कठिन और कम DRY बना देता है। –

+0

@ जेसनस्वाट हाँ स्लग केस उस तरह थोड़ा परेशान है। ज्यादातर अन्य मामलों में, अलगाव के लिए कम बुरे पक्ष होते हैं, जैसे कि जब चीजों का परीक्षण करना आसान होता है तो कॉन्फ़िगर करने के लिए कोई मुश्किल निर्भरता नहीं होती है। –

+1

भंडार में एक विधि "नए उदाहरण बनाने के लिए" ... वास्तव में? रिपोजिटरी केवल डेटा लाने के लिए नहीं है? – Jean

1

सरल प्रीपेर्सिस्ट लाइफसाइक्ल इवेंट की बजाय, इकाई को बचाने के तरीके को बदलने के बिना तर्क को एन्सेप्लेटेड रखने के लिए आपको अधिक शक्तिशाली सिद्धांत घटनाओं का उपयोग करने की आवश्यकता होगी जो केवल अधिक से अधिक तक पहुंच प्राप्त कर सकते हैं इकाई स्वयं

आपको शायद DoctrineSluggableBundle या StofDoctrineExtensionsBundle बंडल देखना चाहिए जो आपको केवल वही करना चाहिए जो आपको चाहिए।

48

आप वास्तव में भंडार प्राप्त कर सकते हैं:

/** 
* @InjectParams({ 
*  "em" = @Inject("doctrine.orm.entity_manager") 
* }) 
*/ 
    public function setInitialStatus(\Doctrine\ORM\EntityManager $em) { 


    $obj = $em->getRepository('AcmeSampleBundle:User')->functionInRepository(); 
    //... 
} 

यह देख आपकी इकाई में और केवल जीवन चक्र कॉलबैक के दौरान। आप इसके बहुत करीब हैं, आपको केवल LifecycleEventArgs पैरामीटर प्राप्त करना है।

इसके अलावा http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html

use Doctrine\ORM\Event\LifecycleEventArgs; 

/** 
* @ORM\Entity(repositoryClass="...\GameRepository") 
* @ORM\HasLifecycleCallbacks() 
*/ 
class Game { 
    /** 
    * @ORM\prePersist 
    */ 
    public function setSlugValue(LifecycleEventArgs $event) { 
     $entityManager = $event->getEntityManager(); 
     $repository = $entityManager->getRepository(get_class($this)); 

     $this->slug = $repository->createUniqueSlugForGame(); 
    } 
} 

पुनश्च देखते हैं। मुझे पता है कि यह एक पुराना सवाल है, लेकिन मैंने किसी भी भविष्य के googlers की मदद करने के लिए इसका उत्तर दिया।

+5

मुझे खुशी है कि आपने इसे पुनर्जीवित किया - मैं उन भविष्य में Googlers में से एक था। मैं वास्तव में पहले से ही एक जीवन चक्र कॉलबैक के भीतर काम कर रहा था और मेरी वस्तु को एक संबंधित वस्तु बनाने या लाने पर निर्भर था। – nealio82

+2

मेरे लिए काम करना (सिम्फनी 2.4), मुझे लगता है कि यह एक स्वीकार्य उत्तर होगा! – mboullouz

+0

भविष्य googler -> – Prof83

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