Intereting Posts
Избавление файлов от имени домена с помощью PHP AMQPRuntimeException: ошибка чтения данных. Получено 0 вместо ожидаемых 7 байт Использование переменных PHP на нескольких страницах Установка Xdebug для PHP на Ubuntu с помощью XAMPP Изменение цвета таблицы на основе значений из базы данных SQL Query с использованием PHP Карты Google: чтение геокода на каждый XML Получить исходный код пользовательского класса и функций? в чем разница между $ _SERVER и $ _GET ? Как запустить команду linux для компиляции программы ac, из php-скрипта Пользовательский модуль Magento Как сохранить переменную в файле config.xml Использует ли facebook комету или ajax для своих уведомлений? Как войти с помощью twitter с помощью PHP и AJAX Как конвертировать mp3 в mp4 с помощью ffmpeg? PHP: включение страницы из глубоко вложенной иерархии каталогов – проблема с производительностью Загружать содержимое facebook через ajax

Как я могу получить доступ к конфигурации приложения 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(); } } 

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

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

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

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

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

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

 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; 

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

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

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

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

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

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

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