zf2

2012-12-22 12 views
27

में एकाधिक डेटाबेस कॉन्फ़िगर करें ज़ेंड फ्रेमवर्क 2 में मैं एकाधिक डेटाबेस को कॉन्फ़िगर (और उपयोग) कैसे कर सकता हूं? वर्तमान में मैं अपने global.php में यह है:zf2

return array(
    'db' => array(
     'driver'   => 'Pdo', 
     'dsn'   => 'mysql:dbname=my_db;host=localhost', 
     'driver_options' => array(
      PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
     ), 
     'username' => 'user', 
     'password' => '******', 
    ), 
    'service_manager' => array(
     'factories' => array(
      'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory', 
     ), 
    ), 
); 

लेकिन मैं एक दूसरा डालने का एक तरीका नहीं दिख रहा।

उत्तर

50

यदि आप ज़ेंड \ डीबी \ एडाप्टर \ एडाप्टर सेवा सेवा को देखते हैं, तो आप देखेंगे कि आपका एडाप्टर कॉन्फ़िगरेशन केवल एक कुंजी 'db' पर इंगित करता है। जिसका अर्थ यह है कि एडाप्टर जो बनाता है वह हमेशा इस (अद्वितीय) कॉन्फ़िगरेशन कुंजी का उपयोग करेगा। ,

namespace Your\Namespace; 

use Zend\ServiceManager\FactoryInterface; 
use Zend\ServiceManager\ServiceLocatorInterface; 
use Zend\Db\Adapter\Adapter; 

class MyAdapterFactory implements FactoryInterface 
{ 

    protected $configKey; 

    public function __construct($key) 
    { 
     $this->configKey = $key; 
    } 

    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     $config = $serviceLocator->get('Config'); 
     return new Adapter($config[$this->configKey]); 
    } 
} 

आपका मुख्य मॉड्यूल में (या किसी अन्य एक) एडेप्टर कारखानों घोषित करने के लिए Module.php फाइल करने के लिए निम्नलिखित जोड़ें:

मैं आप अपने खुद के कारखाने कि इस प्रकार दिखाई देगा बनाने के लिए सलाह देते हैं Zend सेवा प्रबंधक के लिए:

use Your\Namespace\MyAdapterFactory; 
use Zend\ModuleManager\Feature\ServiceProviderInterface; 

class Module implements ServiceProviderInterface{ 

//Previous code 

public function getServiceConfig() 
{ 
    return array(
     'factories' => array(
      'myadapter1'  => new MyAdapterFactory('dbconfigkey1'), 
      'myadapter2'  => new MyAdapterFactory('dbconfigkey2'), 
      ), 
     ); 

} 

//... 

वैश्विक config अब दिखना चाहिए:

return array(
'dbconfigkey1' => array(
    'driver'   => 'Pdo', 
    'dsn'   => 'mysql:dbname=my_db;host=localhost', 
    'driver_options' => array(
     PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
    ), 
    'username' => 'user', 
    'password' => '******', 
), 

'dbconfigkey2' => array(
    'driver'   => 'Pdo', 
    'dsn'   => 'mysql:dbname=my_db2;host=localhost', 
    'driver_options' => array(
     PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
    ), 
    'username' => 'user', 
    'password' => '******', 
), 

); 

एडाप्टर आप सेवा प्रबंधक का उपयोग कर उन्हें कॉल करने की आवश्यकता का उपयोग करें:

$adapter1=$serviceManager->get('myadapter1'); 
$adapter2=$serviceManager->get('myadapter2'); 

संस्करण के रूप में 2.2

एक तत्व सेवा फैक्टरी अब zf2 Zend \ Db मॉड्यूल का हिस्सा है। यह एडेप्टर 'उप-कुंजी के अंतर्गत गुणकों विन्यास कुंजी जोड़ना संभव है:

'db'=> array(
    'adapters'=>array(
     'adapter' => array(
      'driver'   => 'Pdo', 
      'dsn'   => 'mysql:dbname=test;host=localhost', 
      'username' => 'readCredential', 
      'password' => '****' 
     ), 
     'adapter2' => array(
      'driver'   => 'Pdo', 
      'dsn'   => 'mysql:dbname=test;host=localhost', 
      'username' => 'rwCredential', 
      'password' => '****' 
     ), 
    ) 
), 

हालांकि, AbstractServiceFactory जरूरत "मैन्युअल" जोड़े जाने के लिए के रूप में यह तो डिफ़ॉल्ट रूप से नहीं है:

'service_manager' => array(
    'abstract_factories' => array(
      'Zend\Db\Adapter\AdapterAbstractServiceFactory', 
    ) 
), 

एडेप्टर पहले के रूप में सुलभ हैं:

$adapter1=$serviceManager->get('adapter'); 
$adapter2=$serviceManager->get('adapter2'); 

एक प्रदर्शन के नजरिए यह दूसरा दृष्टिकोण है से बेहतर: एक वस्तु के लिए (संभावित) मूल्य बना (सार कारखाना) instantiated हो जाएगा ई विभिन्न एडाप्टर। जबकि पिछले दृष्टिकोण में, प्रति कॉन्फ़िगरेशन एक ऑब्जेक्ट बनाया गया था।

+0

2,1 में बदल रणनीति इस तरह का है? – Saeven

+0

ज़ेंड \ डीबी \ एडाप्टर \ AdapterServiceFactory पर त्वरित रूप से देखने के बाद मुझे ऐसा नहीं लगता है। – yechabbi

+8

अच्छा 2.2 जानकारी, धन्यवाद। – Xunnamius

3

मैं पर https://samsonasik.wordpress.com/2013/07/27/zend-framework-2-multiple-named-db-adapter-instances-using-adapters-subkey/

Zend फ्रेमवर्क 2.2 काफी बेहतर explaination पाया abstract_factories Zend\Db\Adapter\AdapterAbstractServiceFactory है कि हम कई नामित डीबी एडाप्टर उदाहरणों कॉन्फ़िगर करने की अनुमति के साथ आता है। यह चरण दर चरण यह करने के लिए है:

  1. रजिस्टर Zend\Db\Adapter\AdapterAbstractServiceFactory 'service_manager' कुंजी के अंतर्गत 'abstract_factories' प्रकार पर।

    //config/autoload/global.php // .... कॉन्फ़िगर/ऑटोलोड/वैश्विक का हिस्सा।php 'service_manager' => सरणी ( 'abstract_factories' => सरणी ( 'Zend \ Db \ एडाप्टर \ AdapterAbstractServiceFactory', ), ),

  2. पर 'डाटाबेस' कुंजी के अंतर्गत

    कॉन्फ़िगर 'एडेप्टर' उपकुंजी config/autoload/global.php

//config/autoload/global.php // .... config का हिस्सा/autoload/global.php

'db' => array(
    'adapters' => array(

     'db1' => array(
      'driver'   => 'Pdo', 
      'dsn'    => 'mysql:dbname=zf2_staging;host=localhost', 
      'driver_options' => array(
       PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
      ), 
     ), 

     'db2' => array(
      'driver'   => 'Pdo', 
      'dsn'    => 'mysql:dbname=zf2_test;host=localhost', 
      'driver_options' => array(
       PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
      ), 
     ), 
    ), 
), 
    config/autoload/local.php

पर 'डाटाबेस' कुंजी के अंतर्गत

  • कॉन्फ़िगर 'एडेप्टर' उपकुंजी //config/autoload/local.php

    return array(
        'db' => array(
         'adapters' => array(
          'db1' => array(
           'username' => 'root', 
           'password' => '', 
          ), 
          'db2' => array(
           'username' => 'other_user', 
           'password' => 'other_user_passwd', 
          ), 
         ), 
        ), 
    ); 
    
    1. कॉल एडाप्टर 'DB1' या ServiceManager

      से db एडाप्टर के रूप में 'डीबी 2' का उपयोग कर

      $ sm-> प्राप्त ('DB1');

      $ sm-> प्राप्त करें ('डीबी 2');

    आप $sm->get(‘Zend\Db\Adapter\Adapter’) के रूप में प्राथमिक एडाप्टर, 'DB1' और विशेष उद्देश्य के लिए अन्य एडाप्टर के रूप में 'डीबी 2' प्राप्त करने की आवश्यकता है, तो आप सीधे डाटाबेस के तहत प्राथमिक एडाप्टर परिभाषित करने की जरूरत है, तो config/autoload/global.php के विन्यास तरह होगा निम्नलिखित:

    //config/autoload/global.php

    return array(
        'db' => array(
         //this is for primary adapter.... 
         'driver'   => 'Pdo', 
         'dsn'    => 'mysql:dbname=zf21_learn;host=localhost', 
         'driver_options' => array(
          PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
         ), 
    
         //other adapter when it needed... 
         'adapters' => array(
    
          'db1' => array(
           'driver'   => 'Pdo', 
           'dsn'    => 'mysql:dbname=zf2_staging;host=localhost', 
           'driver_options' => array(
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
           ), 
          ), 
          'db2' => array(
           'driver'   => 'Pdo', 
           'dsn'    => 'mysql:dbname=zf2_test;host=localhost', 
           'driver_options' => array(
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'' 
           ), 
          ), 
    
         ), 
        ), 
        'service_manager' => array(
         // for primary db adapter that called 
         // by $sm->get('Zend\Db\Adapter\Adapter') 
         'factories' => array(
          'Zend\Db\Adapter\Adapter' 
            => 'Zend\Db\Adapter\AdapterServiceFactory', 
         ), 
         // to allow other adapter to be called by 
         // $sm->get('db1') or $sm->get('db2') based on the adapters config. 
         'abstract_factories' => array(
          'Zend\Db\Adapter\AdapterAbstractServiceFactory', 
         ), 
        ), 
    ); 
    

    config/autoload/global.local.php निम्नलिखित की तरह भी कॉन्फ़िगर किया जाना चाहिए:

    012,351,

    //config/autoload/local.php

    return array(
        'db' => array(
         // for primary db adapter that called 
         // by $sm->get('Zend\Db\Adapter\Adapter') 
         'username' => 'root', 
         'password' => '', 
    
         // to allow other adapter to be called by 
         // $sm->get('db1') or $sm->get('db2') based on the adapters config. 
         'adapters' => array(
          'db1' => array(
           'username' => 'root', 
           'password' => '', 
          ), 
          'db2' => array(
           'username' => 'other_user', 
           'password' => 'other_user_passwd', 
          ), 
         ), 
        ), 
    ); 
    
  • संबंधित मुद्दे