Подтвердить что ты не робот

Как я могу получить доступ к конфигурации приложения Zend Framework с контроллера?

У меня есть приложение Zend Framework, основанное на настройке быстрого запуска.

Я получил демоверсии, и теперь я собираюсь создать экземпляр нового класса модели для выполнения реальной работы. В моем контроллере я хочу передать конфигурационный параметр (указанный в application.ini) моему конструктору модели, примерно так:

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

Приведенный выше пример разрешает доступ к параметрам, но кажется чрезвычайно крутым. Есть ли лучший способ доступа к конфигурации?

4b9b3361

Ответ 1

Я всегда добавляю следующий init-метод в свой загрузочный файл, чтобы передать конфигурацию в реестр.

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

Это немного сократит ваш код:

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

Ответ 2

Начиная с версии 1.8 вы можете использовать приведенный ниже код в своем контроллере:

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

Ответ 3

В качестве альтернативы вместо использования Zend_Registry вы также можете создать однопроцессорный класс Application, который будет содержать всю информацию о приложении, с функциями открытого участника, которые позволят вам получить доступ к соответствующим данным. Ниже вы можете найти фрагмент с соответствующим кодом (он не будет работать как есть, просто чтобы дать вам представление о том, как он может быть реализован):

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

Ваш бутстрап будет выглядеть следующим образом:

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

Если вы хотите получить доступ к конфигурации, вы должны использовать следующее:

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

Ответ 4

В большинстве приложений ZF объект приложения объявляется в глобальной области (см. public/index.php в приложениях, созданных с помощью ZFW_DISTRIBUTION/bin/zf.sh).

Это не совсем путь ZF, но вы можете получить доступ к объекту с помощью $GLOBALS['application']. Это похоже на обман, но если вы после исполнения, это, скорее всего, будет самым быстрым вариантом.

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

Ответ 5

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

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

Ответ 6

Я определил короткую руку в каком-то месте, в которой я требую_задачу() в начале буфера:

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

и в бутстрапе у меня есть:

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

то я могу получить экземпляр приложения где угодно:

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

Ответ 7

Самый простой способ получить доступ к параметрам конфигурации - это прямой доступ к глобальной переменной $application.

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