Nasıl bir denetleyici bir Zend Framework uygulamasının yapılandırmasını erişebilir?

5 Cevap php

Ben quick-start kurulum dayalı bir Zend Framework uygulama var.

Ben çalışan demoları kazanılmış ve bazı gerçek işler yapmak için yeni bir model sınıf başlatmasını noktada şimdi duyuyorum ettik. Benim denetleyicisi benim modeli yapıcı, böyle bir şey için (application.ini belirtilen) bir yapılandırma parametresi geçmek istiyorum:

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

Yukarıdaki örnekte seçeneklerine erişim izin vermiyor, ama son derece yuvarlak hakkında görünüyor. Yapılandırmayı erişmek için daha iyi bir yolu var mı?

5 Cevap

Ben her zaman kayıt içine yapılandırmasını geçirmek için benim bootstrap için aşağıdaki init-yöntemi ekleyin.

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

Bu kod biraz kısaltmak olacaktır:

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

Sürüm 1.8 beri size Controller aşağıdaki kodu kullanabilirsiniz:

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

Alternatif olarak, yerine Zend_Registry kullanmak ayrıca ilgili verileri erişmek için izin kamu üye fonksiyonları ile tüm uygulama bilgileri, içerecek bir tek uygulama sınıf oluşturabilir. Eğer (bu sadece size bunun nasıl uygulanabileceği bir fikir vermek için, olduğu gibi çalışmaz) ilgili koduyla bir pasajı bulabilirsiniz:

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

Sizin önyükleme gibi olacaktır:

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

Eğer yapılandırma erişmek istediğinizde aşağıdakileri kullanabilirsiniz:

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

Çoğu ZF apps, uygulama nesne (ZFW_DISTRIBUTION/bin/zf.sh ile oluşturulan apps public/index.php bakınız) genel kapsamda ilan edilir.

It's not exactly the ZF way, but you can access the object with $GLOBALS['application']. It kinda feels like cheating, but if you're after performance, this will likely be the quickest option.

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

Ben boostrap başında ben Require_once bazı yerde () kısa bir elini tanımlamak ettik:

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

ve ön-yükleyici olarak bir vardır:

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

o zaman kullanımı ile her yerde uygulama örneği alabilirsiniz:

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