2010-11-24 10 views

Respuesta

5

Aquí está mi enfoque, que puede usar en cualquier lugar de la aplicación:

class My_Controller_Action_Helper_Options extends Zend_Controller_Action_Helper_Abstract 
{ 
    /** 
    * Options separator delimiterm e.g. 
    * option.subkey or 
    * option/subkey 
    */ 
    const DELIMITER = '.'; 

    /** 
    * Retrieve application options from bootstrap 
    * 
    * @return array 
    */ 
    public function getOptions() 
    { 
     $front = $this->getFrontController(); 
     $bootstrap = $front->getParam('bootstrap'); 
     if (null === $bootstrap) { 
      throw new Exception('Unable to find bootstrap'); 
     } 

     return $bootstrap->getOptions(); 
    } 

    /** 
    * Get array key if exists, otherwise returns null 
    * 
    * @param array $values 
    * @param string $key 
    * @return mixed 
    */ 
    private static function _getValue($values, $key) 
    { 
     if (is_array($values) && isset($values[$key])) { 

      return $values[$key]; 
     } 

     return null; 
    } 

    /** 
    * Get application option form bootstrap 
    * 
    * @example 
    * $options = Zend_Controller_Action_HelperBroker::getStaticHelper('options') 
    * ->get('conditions.time', 'defaultvalue'); 
    * 
    * @param string $section 
    * @param mixed $default 
    * @return Zend_Config 
    */ 
    public function get($section = null, $default = null) 
    { 
     $value = $this->getOptions(); 

     if (null !== $section && is_string($section)) { 
      if (false === strpos($section, self::DELIMITER)) { 
       $value = $this->_getValue($value, $section); 
      } else { 
       $sections = explode(self::DELIMITER, $section);   
       foreach ($sections as $section) { 
        $value = $this->_getValue($value, $section); 
        if (null === $value) { 

         break; 
        } 
       } 
      } 

     } 

     if (null === $value) { 

      return $default; 
     } 

     return $value; 
    } 

    /** 
    * @param string $section 
    * @param mixed $default 
    * @return Zend_Config 
    */ 
    public function direct($section = null, $default = null) 
    { 
     return $this->get($section, $default); 
    } 
} 
9

Puede utilizar Zend_Config_Ini

$config = new Zend_Config_Ini('my/ini/file.ini'); 
echo $config->conditions->time; // 50 
+3

Esto hace que el archivo de configuración se lea al menos dos veces = no recomendado. Esos valores ya están en la memoria (en el * bootstrap * param del controlador frontal), por lo que debe recuperarlos desde allí. – takeshin

5

de la aplicación Bootstrap.php tiene acceso a la application.ini usando $this->getOptions(), podría almacenar el valor que desee en su registro algo como esto:

public function _initConditions() 
    { 
    $config = $this->getOptions(); 

    if (isset($config['conditions'])) 
    { 

     $registry = Zend_Registry::getInstance(); 

     $registry->conditions = $config['conditions']; 

    } 
    } 

A continuación, podría acceder a sus condiciones mediante el registro, de la misma manera que las configuró aquí.

+0

¿Qué sentido tiene almacenar en el registro, en lugar de leer directamente de bootstrap? – takeshin

+1

Porque cada vez que necesita el valor, el programa de arranque puede o no estar fácilmente disponible cuando lo necesite? No todos los códigos que necesitan configuración están definidos en los Controladores ... – gnarf

4

Aquí es un ayudante de acción para que:

class My_Controller_Action_Helper_Config 
    extends Zend_Controller_Action_Helper_Abstract 
{ 
    /** 
    * @return array 
    */ 
    public function direct() 
    { 
     $bootstrap = $this->getActionController()->getInvokeArg('bootstrap'); 
     $ns = strtolower(trim($bootstrap->getAppNamespace(), '_')); 
     return $bootstrap->getOption($ns); 
    } 
} 

Tienes que poner el espacio de nombres de aplicaciones como prefijo:

; application.ini 
My.conditions.time= 50 

Usted puede utilizarlo en un controlador de la siguiente manera:

$config = $this->_helper->config(); 
$this->view->time = $config['conditions']['time']; 
+0

Este es un buen ayudante, excepto que no funcionará como uno estático. Debería obtener el bootstrap del controlador frontal si está disponible. Lo siguiente que debe verificar es que las claves de arreglo de configuración sí existen. – takeshin

Cuestiones relacionadas