¿Cómo puedo acceder a la configuración de una aplicación Zend Framework desde un controlador?

5 minutos de lectura

Avatar de usuario de Adam Franco
adam franco

Tengo una aplicación Zend Framework basada en el Inicio rápido configuración.

He conseguido que las demostraciones funcionen y ahora estoy en el punto de instanciar una nueva clase de modelo para hacer un trabajo real. En mi controlador, quiero pasar un parámetro de configuración (especificado en application.ini) a mi constructor de modelos, 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 permite el acceso a las opciones, pero parece extremadamente complicado. ¿Hay una mejor manera de acceder a la configuración?

Siempre agrego el siguiente método de inicio a mi programa de arranque 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();
    }
}

  • 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 simplemente “Zend_Registry::set(‘config’, $this->getOptions());” aunque tendrá que convertirlo en una variable antes de obtener el valor.

    –Alister Bulman

    5 de noviembre de 2009 a las 15:42

  • @Alister: Tiene razón, la forma más rápida sería almacenar la matriz de opciones dentro del registro, pero almacenar la matriz cada vez que desea recuperar un valor único puede ser engorroso.

    – Stefan Gehrig

    5 de noviembre de 2009 a las 17:50

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

    – Hendy Irawan

    1 oct 2010 a las 14:55

  • Por otro lado, Zend_Registry::get(‘config’) requiere que el desarrollador del controlador/módulo se coordine con Bootstrap para obtener la configuración en el registro.

    – Hendy Irawan

    1 de octubre de 2010 a las 14:56

  • Claro, un singleton siempre es una forma OOP de una variable global. Sin embargo, el patrón de registro es una forma común y reconocida de distribuir recursos a través de una aplicación. El uso de Zend_Registry le permite proporcionar un objeto personalizado como su repositorio para extender su funcionalidad a un localizador de servicios o un contenedor de inyección de dependencia. Todas esas cosas no son posibles con el enfoque GLOBALS. Por cierto, no veo por qué el enfoque Zend_Registry no debería funcionar el 100 % del tiempo.

    – Stefan Gehrig

    1 de octubre de 2010 a las 15:48

Desde la versión 1.8, puede usar el siguiente código en su controlador:

$my = $this->getInvokeArg('bootstrap')->getOption('my');

Alternativamente, en lugar de usar Zend_Registry, también puede crear una clase de aplicación única que contendrá toda la información de la aplicación, con funciones de miembros públicos que le permitan acceder a los datos relevantes. A continuación, puede encontrar un fragmento con código relevante (no se ejecutará tal cual, solo para darle 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();            
    }
}

Tu bootstrap 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 quiera acceder a la configuración, usaría lo siguiente:

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

Avatar de usuario de Chris Trahey
chris trahey

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

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

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

Avatar de usuario de SLIM
DELGADO

$this->getInvokeArg('bootstrap')->getOptions();
// or 

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

Avatar de usuario de XUE Can
XUE puede

Definí una mano corta en algún lugar que require_once() al 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 un:

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

entonces puedo obtener la instancia de la aplicación en cualquier lugar por uso:

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

Avatar de usuario de Milán
Milán

Una forma realmente sencilla de acceder a las opciones de configuración es accediendo directamente a las definidas globalmente $aplicación variable.

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

¿Ha sido útil esta solución?