Zend Framework modülü özel veritabanı yapılandırma

2 Cevap php

Ben diğerlerinden farklı bir veritabanı kullanmak için Zend Framework modüllerinden birini istiyorum. The Manual suggests bunu başarmak için modül adı ile application.ini olarak kaynakların önek ama işe alınamıyor.

Benim ilgili bitleri application.ini şunlardır:

resources.modules[] = ""

resources.db.adapter = "PDO_MYSQL"
resources.db.params.host = "localhost"
resources.db.params.dbname = "maindb"
resources.db.params.username = "dbuser"
resources.db.params.password = "..."
resources.db.params.charset = "utf8"

terms.resources.db.params.dbname = "termsdb"

terms modülün adıdır.

Ben bu işi yapmak için Bootstrap koymak için gereken özel bir şey var mı?

2 Cevap

EDIT:

Aşağıdaki OP'ın ilk yorum getirmedi ...

Hayır ben bir modüler DB kaynak kurma hakkında ayrıntılı olamaz. Ne i sağlanan inanıyorum teoride çalışması gerekir. O Zend_Application_Resource_Db bir uzantısı değiştirilmiş gerekenleri emin değil im vermezse i atlatmış gibi, çünkü ben bu kaynağı kullanmak Yüklü. Birden DBS ve benzersiz bağlantı isimleri dayalı bu db bağlantıları getiriliyor sağlayan kendi özel kaynak var. Ben ancak bu :-) üzerinde ellaborate olabilir

Yani ben Zend_Db bunun gibi bir şey görünüyor uzanan bir MyLib_Db sınıf vardır:

class MyLib_Db extends Zend_Db
{
   protected $_instance = null;
   protected $_connections = array();

   /**
    * Standard Zend Framework unified constructor
    * @param null|array An array of options that will be passed to setOptions
    */
   public function __construct($options = null)
   {
   }

   /**
    * Standard Zend Framework setOptions implementation
    * @param array $options and array of options from config
    * @return MyLib_Db
    */
   public function setOptions(array $options)
   {
   }

   /**
    * Set the class instance
    * @param MyLib_Db
    * @return MyLib_Db
    */
   public static function setInstance($instance)
   {
   }

   /**
    * Get/create the singleton instance
    * @return MyLib_Db
    */
   public static function getInstance()
   {
   }

   /**
    * Get a Zend_Db adapter Instance by unique name
    * Searches self::$_connections for the $name param as an array key
    * @param String $name unique connection name
    * @return Zend_Db_Adpater_Abstract|null
    */
   public function getConnection($connectionName)
   {
   }

   /**
    * Add a connection instance to the registry
    * Adds/creates an Zend_Db_Adapter instance to the connection registry with
    * the string key provided by $name. If $connection is an array|Zend_Config it 
    * should match the format used by Zend_Db::factory as it will be passed to this   
    * function. If $name is null then the database name will be used. 
    * @param Zend_Db_Adapter_Abstract|Zend_Config|array The connection to register
    * @param string|null $name A unique name for the connection
    * @return MyLib_Db
    */
   public function addConnection(Zend_Db_Adapter_Abstract $connection, $name = null)
   {
   }

   /**
    * Remove/Destroy the specified connection from the registry
    * @param string $name the connection name to remove
    * @return MyLib_Db
    */
   public function removeConnection($name)
   {
   }
}

Yani temelde DB için benim uygulama kaynak oluşturur ve ödemeler dengesi sınıfının bir örneğini döndürür. Oluşturulması sırasında benim konfigürasyonda kurdunuz herhangi bir bağdaştırıcı oluşturur ve bir isim (o da kullanmak için bir varsayılan bayrak arar Zend_Db_Table yanı sıra diğer bazı şeyler yapıyor gibi) ile bu sınıf örneği bunları kaydeder.

Then i either use MyLib_Db::getInstance()->getConnection($name); or i get the MyLib_Db instance from the bootstrap and then call getConnection.

Şahsen ben bu şekilde yapmak için tercih app geniş veya daha esnek yeniden kullanmak için izin veren bir özel modülüne bağlı olan bir bağlantısı olan onun bağımlı değildir çünkü. Yani ben aslında sadece Doktrini kullanarak yerine Zend_Db Ive çünkü benim Zend projelerin çoğunda bir kaç proje üzerinde bu kullandık dedi.

O :-) Umarım yardımcı olur


Aslında i modules.terms.resources.db.* gibi config senin Modulunun bölümünde koymak gerektiğini düşünüyorum. Bu modül bootstrap yüklemek yapmak gerekir. İsterseniz Terms_Bootstrap bir _initDb ile kurmak manullay olabilir.

I özel bir DB yönetim sınıfını kullanın ve yerine benim kaynaklar koymak Şahsen olsa - bir tek veya birden çok bağdaştırıcı ayarı yönetir. Ardından $db kaynaklar diziden alınan müdür olduğunu aşağıdaki assiming ...

$dbAdapter = $db->getConnection('terms');

Aşağıdaki gibi yapın:

moduleName.host = "localhost"
moduleName.username = "user"
moduleName.password = "pass"
moduleName.dbname = "dbname"
moduleName.charset = "utf8"

Daha sonra herhangi bir init fonksiyonu içinde Modulunun bootstrap.php aşağıdaki ekleyin

$params = $GLOBALS['application']->getOption('moduleName');
$dbAdapter = Zend_Db::factory('PDO_MYSQL', array(
    'host' => $params['host'],
    'dbname' => $params['dbname'],
    'username' => $params['username'],
    'password' => $params['password'],
    'charset'  => $params['charset'],
));
Zend_Registry::set('moduleSpecific', $dbAdapter);

Sonra modülün model/DbTable/ klasöründe aşağıdaki gibi bir sınıf oluşturmak ve masa classess yerine Zend_Db_Table_Abstract arasında ModuleName_Model_DbTable_Tablemain genişletmek için izin ve gitmeye hazırız.

class ModuleName_Model_DbTable_Tablemain extends Zend_Db_Table_Abstract
{
    /**
     * 
     * wrapper class constructor used to set db adaptor on the fly
     * @author Krishan
     */
    function __construct(){

        parent::__construct($adapter = Zend_Registry::get('moduleSpecific'));

    }
}

bana herhangi bir problem durumunda bildirin