2011-03-04 15 views
11

iam usando zend framework para construir un servicio web REST y estoy usando módulos para separar mis versiones api.problema con la configuración específica del módulo zend

Ahora, quiero tener un archivo de configuración separado para cada uno de mis módulos (v1 y v2), principalmente para especificar conexiones de bases de datos separadas.

que tenían una estructura de directorios como esto:

- application 
     - modules 
      - v1 
        - controllers 
        - models 
        - views 
        - configs 
        - module.ini   
      - v2 
        - controllers 
        - models 
        - views 
        - configs 
        - module.ini 
     - configs 
      - application.xml 
- library 

que ya tienen la conexión de base de datos mencionada en mi "application.ini" dentro de la aplicación/configs. Leí here sobre las configuraciones específicas del módulo y lo probé.

Quité estos parametros de bases de datos de application.ini y lo puse en module.ini:

[production] 
resources.db.adapter = PDO_MYSQL 
resources.db.params.host = 127.0.0.1 
resources.db.params.username = myuser 
resources.db.params.password = mypwd 
resources.db.params.dbname = my_db 
resources.db.params.profiler.enabled = "true" 
resources.db.params.profiler.class = "Zend_Db_Profiler_Firebug" 

.....

pero me dio un error que dice "No se encontró adaptador ... "cuando accedí a la base de datos en el controlador de mi módulo. Por favor, ayuda ...

+0

necesita más información, ¿en qué línea obtiene el error? ¿Es un error fatal de PHP? – emaillenin

+0

Creo que es solo un mensaje de error normal. Pero la ejecución se detuvo después del error. –

+0

¿Desea agregar esto en el archivo /public/.htaccess: 'SetEnv APPLICATION_ENV" development "' Entonces cuéntenos los detalles del error. – Perfection

Respuesta

2

La solución (My_App) a la que hace referencia en su pregunta no requiere ninguna configuración adicional para las conexiones de bases de datos específicas del módulo, o cualquier otra configuración específica del módulo (excepto las rutas). Todo lo que necesita hacer es declarar un recurso MultiDb en la aplicación.ini como db1. Entonces puede declarar cualquier recurso de base de datos específico del módulo en el module.ini respectivo del módulo solicitado como db2, db3, db4 ... etc ... no necesita ninguna configuración adicional. Puse un ejemplo en el archivo de descarga en mi github. No faltar al respeto a la respuesta de "mingos" anterior, pero no es necesario ningún código adicional en My_App.

Aquí está la verbage exacta tomada de la descarga (application.ini):

...if this resource is declared here, then it 
will be available to all modules. If different 
db resources need to be used for different 
modules then MultiDB resource can be 
initiated. Example: A general db resource can be 
defined here and a module specific db can be 
declared in its corresponding module.ini. 
The db resource declared in the module will not 
be available to other modules but the db resource 
in this application.ini will be available to all 
modules... 

Entonces se declara un solo recurso db como un ejemplo en la descarga. Simplemente cámbialo a un recurso multi db. Declare el recurso de db necesario para la aplicación en application.ini y cualquier recurso de db adicional que sea necesario para cualquier módulo específico en sus respectivos archivos module.ini. Es sencillo. Eso es todo lo que necesitas hacer. Una vez que entiendas la lógica detrás de My_App, verás que es muy poderoso.

+0

Gracias por la amable respuesta osebboy. Es genial de tu parte ¿Puedes mencionar la línea que debo escribir en mi solicitud?ini para declarar un recurso MultiDb? –

+1

# resources.multidb.db1.adapter = "pdo_mysql" # resources.multidb.db1.host = "localhost" # resources.multidb.db1.username = "webuser" # resources.multidb.db1.password = " XXXX " # resources.multidb.db1.dbname =" db1 " Lo anterior es la declaración inicial de un recurso multiDb. Puede declararlo en la aplicación.ini. Como está declarado en application.ini, estará disponible para todos los módulos. Ahora, si necesita un recurso Db adicional en un módulo específico, puede declarar dicho recurso en su module.ini correspondiente como db2, db3 ... – osebboy

+0

De esta manera puede tener un recurso de base de datos amplio de la aplicación y recursos db específicos del módulo. No se necesita código Recuerde que My_App crea módulos completamente aislados. Sugiero que trates de entender la lógica detrás de My_App. – osebboy

1

La solución de osebboy no está configurada para tener un archivo de configuración que no sea .ini. Tienes application.xml. Parece que la configuración inicial es incorrecta según la solución de osebboy.

Sugiero que descargue la fuente de su github y la configure de esa manera. Lea también su publicación en el blog al respecto.

6

En el arranque, puede establecer conexiones de base de datos:

protected function _initDb() { 
    $config['my_db1'] = new Zend_Config_Ini(APPLICATION_PATH . '/configs/my_db1.ini'); 
    $config['my_db2'] = new Zend_Config_Ini(APPLICATION_PATH . '/configs/my_db2.ini'); 

    $my_db1 = new Plugin_Replication($config['my_db1']->toArray()); 
    $my_db1->query("SET CHARACTER SET utf8;"); 

    $my_db2 = new Plugin_Replication($config['my_db2']->toArray()); 
    $my_db2->query("SET CHARACTER SET utf8;"); 

    Zend_Db_Table::setDefaultAdapter($dmy_db1); 
    Zend_Registry::set('my_db1', $my_db1); 
    Zend_Registry::set('my_db2', $my_db2); 
} 

Cada conexión se especifica en un archivo .ini por separado en mi caso. Encuentro esto bastante intuitivamente organizado. Un archivo ini de base de datos no requiere los nombres resources.db.whatever. Mina algo así:

[Master] 
host = "xxx" 
username = "xxx" 
password = "xxx" 
dbname = "xxx" 
charset = utf8 

[Slaves] 
first.host = "xxx" 
first.username = "xxx" 
first.password = "xxx" 
first.dbname = "xxx" 
first.charset = utf8 

second.host = "xxx" 
second.username = "xxx" 
second.password = "xxx" 
second.dbname = "xxx" 
second.charset = utf8 

Una vez que haya múltiples bases de datos configurado de esta manera, al crear un modelo (en cualquier módulo que desea), puede informar a ZF sobre la base de datos que desea utilizar:

protected function _setupDatabaseAdapter() { 
    $this->_db = Zend_Registry::get('my_db1'); 
} 

Este será su adaptador predeterminado. En caso de tener que utilizar dos bases de datos en la misma consulta, iniciar la función de su modelo con:

public function myAwesomeSqlQuery() { 
    $db1 = $this->getAdapter()->getConfig(); //default adapter 
    $db2 = Zend_Registry::get('my_db2')->getConfig(); //additional adapter 

Ahora, usted puede escribir su consulta utilizando las dos bases de datos de esta manera:

$sql = $this 
    ->select() 
    ->setIntegrityCheck(false) 
    ->from(array('col1' => $db1['dbname'].'.some_column')) 
    ->join(array('col2' => $db2['dbname'].'.some_other_column')),'col1.id = col2.id') 
; 

Como sugerí en un comentario, también puede usar bootstraps específicos del módulo. La estructura sería algo así:

/application/ 
    -- /modules/ 
    -- /v1/ 
     -- /controllers/ 
     -- /views/ 
     -- /Bootstrap.php 
    -- /v2/ 
     -- /controllers/ 
     -- /views/ 
     -- /Bootstrap.php 

Los propios esfuerzos específicos del módulo se construyen más o menos como cualquier otra rutina de carga, pero afectan el módulo en cuestión. Los nombres de las clases generalmente tienen el prefijo de los nombres de los módulos, p.:

<?php 
class V1_Bootstrap extends Zend_Application_Bootstrap_Bootstrap { 
    ... 
} 

por lo general trato de no usar ayuda de nadie específicos del módulo, ya que están todos en marcha con cada solicitud (Zend Framework 2 se supone que debe corregir este), funciones que no son necesarias para su funcionamiento módulo actual. De todos modos, he encontrado una rutina de carga específica del módulo en uno de mis módulos, que contiene algo como esto:

class MyModule_Bootstrap extends Zend_Application_Bootstrap_Bootstrap { 
    protected function _initLoggers() { 
     $my_db1 = Zend_Registry::get('my_db1'); 
     $my_db2 = Zend_Registry::get('my_db2'); 
     $my_db1->setProfiler(new Zend_Db_Profiler_Firebug())->getProfiler()->setEnabled(true); 
     $my_db2->setProfiler(new Zend_Db_Profiler_Firebug())->getProfiler()->setEnabled(true); 

     $auth = Zend_Auth::getInstance(); 
     $columnMapping = array('priority' => 'priority' , 'message' => 'message' , 'timestamp' => 'timestamp' , 'username' => 'username'); 
     $logger = new Zend_Log(new Zend_Log_Writer_Db($my_db1, 'logs', $columnMapping)); 
     print_r($auth->getIdentity()); 
     if ($auth->hasIdentity()) 
      $logger->setEventItem('username', $auth->getIdentity()->username); 
     Zend_Registry::set('logger', $logger); 
    } 

Eso es más o menos la misma. Espero que ayude.

+2

+1 y otro si pudiera! _ ¡Muy buena respuesta! – Kyle

+0

Mingos, quiero probar su solución, pero estoy confundido con la parte modelo de los módulos ... puede publicar el código relacionado con el modelo y cómo consultar desde el modelo o controlador –

+0

Todo está ahí en la respuesta. ¿Con qué estás teniendo problemas específicamente? – mingos

Cuestiones relacionadas