2009-11-05 25 views
22

Tengo una aplicación de Zend Framework basada en la configuración quick-start.¿Cómo puedo acceder a la configuración de una aplicación de Zend Framework desde un controlador?

He conseguido que las demostraciones funcionen y ahora estoy a punto de crear una nueva clase de modelo para hacer un trabajo real. En mi controlador Quiero pasar un parámetro de configuración (especificado en el application.ini) a mi modelo constructor, algo como esto:

class My_UserController extends Zend_Controller_Action 
{ 
    public function indexAction() 
    { 
     $options = $this->getFrontController()->getParam('bootstrap')->getApplication()->getOptions(); 
     $manager = new My_Model_Manager($options['my']); 
     $this->view->items = $manager->getItems(); 
    } 
} 

El ejemplo anterior no permitir el acceso a las opciones, pero parece extremadamente rotonda . ¿Hay una mejor manera de acceder a la configuración?

Respuesta

47

Siempre agrego el siguiente método init a mi bootstrap para pasar la configuración al registro.

protected function _initConfig() 
{ 
    $config = new Zend_Config($this->getOptions(), true); 
    Zend_Registry::set('config', $config); 
    return $config; 
} 

Esto acortará su código un poco:

class My_UserController extends Zend_Controller_Action 
{ 
    public function indexAction() 
    { 
     $manager = new My_Model_Manager(Zend_Registry::get('config')->my); 
     $this->view->items = $manager->getItems(); 
    } 
} 
+0

Eso requerirá un poco de trabajo para volver a analizar la matriz en un objeto. Si prefiere tener la configuración como una matriz, es solo "Zend_Registry :: set ('config', $ this-> getOptions());" aunque deberás sacarlo en una variable antes de obtener el valor. –

+0

@Alister: tiene razón, la forma más rápida sería almacenar las opciones-matriz dentro del registro, pero almacenar la matriz cada vez que desee recuperar un solo valor puede ser engorroso. –

+2

Esto no es diferente de la idea de $ GLOBALS ['application'] a continuación, con el beneficio adicional de que $ GLOBALS ['application'] funciona probablemente el 99% del tiempo. –

6

Como alternativa, en lugar de utilizar Zend_Registry También podría crear una clase de aplicaciones Singleton que contendrá toda la información de la aplicación, con funciones miembro públicas que permitan para acceder a los datos relevantes. A continuación puede encontrar un fragmento de código en cuestión (no se ejecutará como está, sólo para darles una idea de cómo se puede implementar):

final class Application 
{ 
    /** 
    * @var Zend_Config 
    */  
    private $config = null; 

    /** 
    * @var Application 
    */  
    private static $application; 

    // snip 

    /** 
    * @return Zend_Config 
    */ 
    public function getConfig() 
    { 
     if (!$this->config instanceof Zend_Config) { 
      $this->initConfig(); 
     } 
     return $this->config; 
    } 

    /** 
    * @return Application 
    */ 
    public static function getInstance() 
    { 
     if (self::$application === null) { 
      self::$application = new Application(); 
     } 
     return self::$application; 
    } 

    /** 
    * Load Configuration 
    */ 
    private function initConfig() 
    { 
     $configFile = $this->appDir . '/config/application.xml'; 
     if (!is_readable($configFile)) { 
      throw new Application_Exception('Config file "' . $configFile . '" is not readable'); 
     } 
     $config = new Zend_Config_Xml($configFile, 'test'); 
     $this->config = $config; 
    } 

    // snip 

    /** 
    * @param string $appDir 
    */ 
    public function init($appDir) 
    { 
     $this->appDir = $appDir; 
     $this->initConfig(); 
     // snip 
    } 

    public function run ($appDir) 
    { 
     $this->init($appDir); 
     $front = $this->initController(); 
     $front->dispatch();    
    } 
} 

Su arranque se vería así:

require 'Application.php'; 
try { 
    Application::getInstance()->run(dirname(dirname(__FILE__))); 
} catch (Exception $e) { 
    header("HTTP/1.x 500 Internal Server Error"); 
    trigger_error('Application Error : '.$e->getMessage(), E_USER_ERROR); 
} 

Cuando se desea acceder a la configuración que utilizaría el siguiente:

$var = Application::getInstance()->getConfig()->somevar; 
0

he definir una mano corta en algún lugar en el que require_once() en el comienzo de boostrap:

function reg($name, $value=null) { 
    (null===$value) || Zend_Registry::set($name, $value); 
    return Zend_Registry::get($name); 
} 

y en el arranque Tengo:

protected function _initFinal() 
{ 
    reg('::app', $this->getApplication()); 
} 

entonces puedo obtener la instancia de solicitud en cualquier lugar mediante el uso:

$app = reg('::app'); 
3

En la mayoría de aplicaciones de ZF, el objeto de la aplicación se declara en el alcance global (vea public/index.php en aplicaciones creadas con ZFW_DISTRIBUTION/bin/zf.sh).

No es exactamente el modo ZF, pero puede acceder al objeto con $GLOBALS['application']. Se siente como hacer trampa, pero si buscas una actuación, esta será probablemente la opción más rápida.

$manager = new My_Model_Manager($GLOBALS['application']->getOption('my')); 
+1

Siempre es posible eludir el marco y todas sus abstracciones. Una solución como esta debería ser un truco de todos los demás fallos, no una solución de acceso. Es improbable que el rendimiento sea crítico en ningún caso; una variable de configuración no necesita ser buscada dentro de un bucle de rendimiento crítico. –

+0

¿Cuál es el My_Model_Manager? – zardilior

+0

@zardilior mi mejor conjetura (4 años después) es que se trata de una clase de usuario-tierra hipotética que depende de una opción hipotética definida por el usuario 'mi'. Ambos se deleitan con la pregunta SO ;-) –

21

Desde la versión 1.8 se puede usar el siguiente código en tu controlador:

$my = $this->getInvokeArg('bootstrap')->getOption('my'); 
1
$this->getInvokeArg('bootstrap')->getOptions(); 
// or 

$configDb = $this->getInvokeArg('bootstrap')->getOption('db'); 
0

Una forma muy sencilla de acceder a las opciones de configuración está accediendo directamente a la definida globalmente aplicación $ variable.

class My_UserController extends Zend_Controller_Action { 
    public function indexAction() { 
     global $application; 
     $options = $application->getOptions(); 
    } 
} 
Cuestiones relacionadas