web-dev-qa-db-fra.com

Comment puis-je accéder à la configuration d'une application Zend Framework à partir d'un contrôleur?

J'ai une application Zend Framework basée sur la configuration quick-start

Les démos ont bien fonctionné et je suis sur le point d'instancier une nouvelle classe de modèles pour effectuer un travail réel. Dans mon contrôleur, je souhaite transmettre un paramètre de configuration (spécifié dans le fichier application.ini) au constructeur de mon modèle, qui ressemble à ceci:

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();
    }
}

L'exemple ci-dessus permet d'accéder aux options, mais semble très arrondi. Y a-t-il un meilleur moyen d'accéder à la configuration?

23
Adam Franco

J'ajoute toujours la méthode init suivante à mon bootstrap pour transmettre la configuration au registre.

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

Cela raccourcira un peu votre code:

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();
    }
}
47
Stefan Gehrig

Depuis la version 1.8, vous pouvez utiliser le code ci-dessous dans votre contrôleur:

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

Alternativement, au lieu d'utiliser Zend_Registry, vous pouvez également créer une classe d'application singleton qui contiendra toutes les informations sur l'application, avec des fonctions de membre public vous permettant d'accéder aux données pertinentes. Vous trouverez ci-dessous un extrait avec le code approprié (il ne fonctionnera pas tel quel, juste pour vous donner une idée de la façon dont il peut être implémenté):

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();            
    }
}

Votre bootstrap ressemblerait à ceci:

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);
}

Lorsque vous souhaitez accéder à la configuration, utilisez les éléments suivants:

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

Dans la plupart des applications ZF, l'objet d'application est déclaré dans l'étendue globale (voir public/index.php dans les applications créées avec ZFW_DISTRIBUTION/bin/zf.sh).

Ce n'est pas exactement la manière de ZF, mais vous pouvez accéder à l'objet avec $GLOBALS['application']. Cela ressemble un peu à de la triche, mais si vous recherchez des performances, ce sera probablement l'option la plus rapide.

$manager = new My_Model_Manager($GLOBALS['application']->getOption('my'));
3
Chris Trahey
$this->getInvokeArg('bootstrap')->getOptions();
// or 

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

J'ai défini une main courte dans un endroit où j'ai besoin de_on () au début de boostrap:

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

et dans le bootstrap j'ai un:

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

alors je peux obtenir l'instance d'application n'importe où en utilisant:

$app = reg('::app');
0
XUE Can

Un moyen très simple d'accéder aux options de configuration consiste à accéder directement à la variable $ application définie globalement. 

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