2010-11-05 12 views
30

मेरे पास 2 इकाइयां हैं: देश (आईडी, नाम) और मैपिंग (आईडी, ऑब्जेक्ट, आंतरिक आईडी, बाहरी आईडी)। देश और मानचित्रण संघों से जुड़े नहीं हैं (क्योंकि मैपिंग न केवल देश के लिए पंक्तियां हैं)। मैं देश निम्न स्थितियों में उपयोग करने के लिए बाहरी आईडी प्राप्त करने की आवश्यकता:सिद्धांत 2.0 इकाइयों के अंदर EntityManager का उपयोग

  • country.id = mapping.internalId
  • mapping.object = 'country'

तो मैं देश में समारोह getExternalId() जोड़ने के लिए

function getExternalId() { 
    $em = Registry::getEntityManager(); 

    $mapping = $em->getRepository('Mapping')->findOneBy(array(
     'object'  => 'country', 
     'internalId' => $this->getId() 
    )); 

    return !empty($mapping) ? $mapping->getExternalId() : false; 
} 

सवालों की योजना:

  1. क्या संस्थाओं के अंदर EntityManager का उपयोग करना अच्छा अभ्यास है? यदि नहीं, तो कृपया बताएं कि मेरे मामले में बाहरी आईडी कैसे प्राप्त करें?
  2. शायद yaml फ़ाइलों का उपयोग कर देश और मानचित्रण को जोड़ना संभव है?

अग्रिम धन्यवाद!

उत्तर

51

किसी इकाई ऑब्जेक्ट को इकाई प्रबंधक पर भरोसा करने की अनुमति देना अच्छा नहीं है। यह इकाई को दृढ़ता परत से जोड़ता है, जो एक समस्या थी सिद्धांत 2 विशेष रूप से हल करने की कोशिश कर रहा था। इकाई प्रबंधक पर भरोसा करने में सबसे बड़ी परेशानी यह है कि यह आपके मॉडल को डेटाबेस से दूर अलगाव में परीक्षण करने में कठोर बनाता है।

आपको इकाई प्रबंधन पर निर्भर संचालन को संभालने के लिए शायद सेवा ऑब्जेक्ट्स पर निर्भर होना चाहिए।

// CountryService 
public function getExternalId($country) {} 

इसके अतिरिक्त, आप बाहरी रूप से सेट की गई किसी सेवा ऑब्जेक्ट को कॉल करने के लिए अपने मॉडल पर प्रॉक्सी विधियां बना सकते हैं। इकाई प्रबंधक की तुलना में परीक्षण करते समय एक सेवा ऑब्जेक्ट नकली करना बहुत आसान होगा।

$country->setService($countryService); 
$country->getExternalId(); 

// Country 
public function getExternalId() 
{ 
    $this->_service->getExternalId($this); 
} 
+6

मैं सिद्धांत के लिए सेवा कार्यान्वयन के बारे में अच्छे ट्यूटोरियल ढूंढ रहा हूं। क्या कोई अच्छा ट्यूटोरियल जानता है। – user257980

+0

क्या इस उदाहरण में सेवा ऑब्जेक्ट को इकाई में आंतरिक होना चाहिए या आप इसे इकाई के साथ उपयोग कर सकते हैं? उदाहरण के लिए। $ सेवा = नया देश \ ServiceObject; $ ExtId = $ सेवा-> getExternalId ($ देश) प्राप्त करें; – calumbrodie

+0

सिद्धांत के लिए सेवा कार्यान्वयन: http://symfony.com/doc/current/book/service_container.html – bleuscyther

8

मुझे लगता है कि आपको उपयोग करने की आवश्यकता है एंटीटी रिपोजिटरीज। ये दस्तावेज में विस्तृत हैं, हालांकि जानकारी खोजने के लिए थोड़ा मुश्किल है। यहां Getting Started आलेख का एक लिंक दिया गया है जो दस्तावेज करता है कि कोई व्यक्ति आपकी संस्थाओं के लिए 'पहुंच' कार्यों का "भंडार" कैसे बनाएगा।

<?php 
// repositories/CountryRepository.php 

use Doctrine\ORM\EntityRepository; 

class CountryRepository extends EntityRepository 
{ 
    public function getExternalId() 
    { 
+0

ऐसा लगता है कि लिंक मर चुका है – Gigala

+1

इस समय, लिंक काम कर रहा है। मुझे लगता है कि यह ओपी के सवाल का एक बहुत अच्छा समाधान है। –

1

एक थोड़ा इस के किनारे परिशिष्ट काटने, जिसमें काम का हो सकता है (पीएचपी 5.4 इस पोस्ट के समय में अल्फा 2 में किया जा रहा है):

इसके अतिरिक्त यहां

कुछ छद्म कोड प्राप्त करने के लिए शुरू कर दिया है आप भविष्य:

Here Doctrine2 के भीतर php 5.4 लक्षणों का उपयोग करने के कुछ उदाहरण हैं; जिसमें से एक को सक्रिय इकाई कहा जाता है और इकाई के भीतर से इकाई प्रबंधक तक पहुंच सहित सिद्धांत 2 के भीतर सक्रिय रिकॉर्ड शैली कार्यक्षमता प्रदान करता है।

9

यह शायद सबसे अच्छा विचार नहीं है, लेकिन ऐसा करने का एक आसान तरीका है।

UnitOfWork सिद्धांत में कक्षा किसी भी इकाई को हाइड्रेट करेगा जो उस इकाई के लिए इकाई प्रबंधक और वर्ग मेटाडेटा के साथ ObjectManagerAware लागू करती है।

सभी आप अपनी इकाई में इकाई चरनी पाने के लिए क्या करना है के रूप में नीचे दिखाए गए उदाहरण इंटरफ़ेस को लागू है:

use Doctrine\Common\Persistence\Mapping\ClassMetadata; 
use Doctrine\Common\Persistence\ObjectManager; 
use Doctrine\Common\Persistence\ObjectManagerAware; 

/** 
* @ORM\Entity 
*/ 
class MyEntity implements ObjectManagerAware 
{ 
    public function injectObjectManager(ObjectManager $objectManager, ClassMetadata $classMetadata) 
    { 
     $this->em = $objectManager; 
    } 
} 

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

+0

अच्छा काम @peterjwest :) – juanmf