2017-11-22 25 views
10

मैंने डेटाबेस से दो कनेक्शन कॉन्फ़िगर किए हैं। एक कनेक्शन को उपयोगकर्ता कहा जाता है और अन्य को क्लाइंट कहा जाता है। यह config.yml फ़ाइल में कॉन्फ़िगरेशन है:सिम्फनी 3.3 सीम में एकाधिक इकाई प्रबंधक सेवा तर्क के रूप में काम नहीं करने के लिए

doctrine: 
    dbal: 
     default_connection: client 
     connections: 
      client: 
       driver: pdo_mysql 
       host: '%client_database_host%' 
       port: '%client_database_port%' 
       dbname: '%client_database_name%' 
       user: '%client_database_user%' 
       password: '%client_database_password%' 
       charset: UTF8 
       mapping_types: 
        enum: string 
      user: 
       driver: pdo_mysql 
       host: '%user_database_host%' 
       port: '%user_database_port%' 
       dbname: '%user_database_name%' 
       user: '%user_database_user%' 
       password: '%user_database_password%' 
       charset: UTF8 
       mapping_types: 
        enum: string 

    orm: 
     auto_generate_proxy_classes: '%kernel.debug%' 
     default_entity_manager: ~ 
     entity_managers: 
      client: 
       naming_strategy: doctrine.orm.naming_strategy.underscore 
       mappings: 
        ProjectModelBundle: ~ 
       connection: client 
      user: 
       naming_strategy: doctrine.orm.naming_strategy.underscore 
       mappings: 
        BaseModelBundle: ~ 
        ProjectModelBundle: ~ 
       connection: user 

लेकिन मुझे हमेशा पहले इकाई प्रबंधक मिल रहा है इससे कोई फर्क नहीं पड़ता। यह वह जगह है मैं कैसे उपयोग कर रहा हूँ इकाई प्रबंधक की सेवाओं में:

# BASE 
    htec.project_model_bundle.repository.database.client_base: 
     class: Project\BaseModelBundle\Repository\Database\DatabaseRepository 
     arguments: ['@service_container', '@doctrine.orm.client_entity_manager', '@form.factory'] 

    htec.project_model_bundle.repository.database.user_base: 
     class: Project\BaseModelBundle\Repository\Database\DatabaseRepository 
     arguments: ['@service_container', '@doctrine.orm.user_entity_manager', '@form.factory'] 

लेकिन कोई फर्क नहीं पड़ता कि मुझे क्या करना है, मैं हमेशा पहले इकाई प्रबंधक है कि मैं orm- के तहत परिभाषित किया है> मिल entity_managers सेटिंग्स। उदाहरण के लिए यदि इस तरह कॉन्फ़िगर ORM:

orm: 
     auto_generate_proxy_classes: '%kernel.debug%' 
     default_entity_manager: ~ 
     entity_managers: 
      client: 
       naming_strategy: doctrine.orm.naming_strategy.underscore 
       mappings: 
        ProjectModelBundle: ~ 
       connection: client 
      user: 
       naming_strategy: doctrine.orm.naming_strategy.underscore 
       mappings: 
        BaseModelBundle: ~ 
        ProjectModelBundle: ~ 
       connection: user 

मैं हमेशा क्लाइंट इकाई प्रबंधक मिल जाएगा, भले ही मैं आपूर्ति '@ doctrine.orm.user_entity_manager' सेवा तर्क के रूप में।

अगर मैं कॉन्फ़िगर इस तरह ORM:

orm: 
     auto_generate_proxy_classes: '%kernel.debug%' 
     default_entity_manager: ~ 
     entity_managers: 
      user: 
       naming_strategy: doctrine.orm.naming_strategy.underscore 
       mappings: 
        BaseModelBundle: ~ 
        ProjectModelBundle: ~ 
       connection: user 
      client: 
       naming_strategy: doctrine.orm.naming_strategy.underscore 
       mappings: 
        ProjectModelBundle: ~ 
       connection: client 

मैं हमेशा उपयोगकर्ता इकाई प्रबंधक मिल जाएगा, भले ही मैं आपूर्ति '@ doctrine.orm.client_entity_manager' सेवा तर्क के रूप में।

मैं यहाँ क्या गलत कर रहा हूं?

+1

आप की जाँच की है 'बिन/सांत्वना डिबग : कंटेनर doctrine.orm.client_entity_manager' (या अन्य) क्या कंटेनर में सेवाएं सही तरीके से पंजीकृत हैं या नहीं? – dbrumann

+1

क्या आपने '@ doctrine' का उपयोग करने का प्रयास किया है जो आपको एक [रजिस्ट्री] (https://github.com/doctrine/DoctrineBundle/blob/master/Registry.php) देता है जिसके साथ आप 'getEntityManagerForClass()' को पुनर्प्राप्त करने के लिए उपयोग कर सकते हैं आपकी सेवाओं के अंदर किसी भी कक्षा के लिए सही इकाई प्रबंधक? – dbrumann

उत्तर

-1

तो आपने DatabaseRepository नामक एक सेवा परिभाषित की है जो दो भिन्नताओं में मौजूद है। एक बिंदु पर यह 'क्लाइंट' इकाई प्रबंधक प्राप्त करता है, और दूसरी ओर यह 'उपयोगकर्ता' इकाई प्रबंधक प्राप्त करता है?

मुझे लगता है कि यह हमेशा आपको 'क्लाइंट' प्रबंधक को सबसे अधिक वापस देता है क्योंकि यह पहली बार सेवा कंटेनर के लिए सेवा परिभाषित किया गया है। इससे कोई फर्क नहीं पड़ता कि आप इसे उसी .yml कोड में बाद में परिभाषित करते हैं।

अब, आपके लिए एक बड़ा "क्यों" राजनीतिक प्रश्न है। आपने दो सेवा वर्गों को परिभाषित क्यों नहीं किया, प्रत्येक विशेष प्रबंधक के लिए? यदि आपको वास्तव में ऐसा करना है, तो यह आपके प्रोजेक्ट के शेष कोड में कुछ गंभीर डिज़ाइन समस्याओं को इंगित करता है।

एक और सुझाव: अपने वर्गों को कुछ और वर्णनात्मक नाम दें। एक इकाई प्रबंधक और भंडार वर्ग निश्चित रूप से डेटाबेस के बारे में कुछ करते हैं। उचित वर्ग में कक्षाओं, गुणों, चरों का नामकरण करना, मुझे काम के सबसे चुनौतीपूर्ण हिस्से में से एक माना जाता है, लेकिन यह हमारे जीवन को आसान बनाता है।

बीटीडब्ल्यू। सेवा कंटेनर के रूप में पूरे कंटेनर को पास करने से बचें:

arguments: ['@service_container', 

क्योंकि यह बहुत महंगा संसाधन है।

0

हाल ही में मुझे एक समान समस्या थी। @dbrumann की टिप्पणी ने मुझे हल करने के लिए एक अच्छा सुराग दिया। आप कंसोल आदेश debug:autowiring का उपयोग करते हैं

  1. आप एक सेवा सिद्धांत के रूप में एलियास है देखेंगे: मैं अगले दृष्टिकोण का इस्तेमाल किया।

    Doctrine\Common\Persistence\ManagerRegistry alias to doctrine 
    
  2. आप द्वारा टाइप हिंट आपके लक्षित कक्षा में है कि सेवा करने के लिए उपयोग कर सकते हैं अपने लक्ष्य वर्ग के निर्माता में सेवा वर्ग (या इंटरफ़ेस) तर्क के रूप में के नाम पर रख दिया।

  3. अब आप अपने लक्ष्य कक्षा में सेवा के सभी तरीकों का उपयोग कर सकते पद्धति का उपयोग करके getManager() आप अपने प्रबंधकों के किसी भी मिल जाएगा द्वारा:

    use Doctrine\Common\Persistence\ManagerRegistry; 
    
    $protected $managerRegistry; 
    
    public function __construct(ManagerRegistry $managerRegistry) 
    { 
        $this->managerRegistry = $managerRegistry; 
    } 
    
    public function foo() 
    { 
        // asuming your managers names are default and second 
        $firstManager = $this->managerRegistry->getManager('default'); 
        $secondManager = $this->managerRegistry->getManager('second'); 
    } 
    
संबंधित मुद्दे