Как я могу получить доступ к конфигурации приложения 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();
}
}
Приведенный выше пример разрешает доступ к параметрам, но кажется чрезвычайно крутым. Есть ли лучший способ доступа к конфигурации?
Ответы
Ответ 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();
}
}