У меня есть приложение 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(); } }