2009-11-05 12 views
22

Mam aplikację Zend Framework opartą na konfiguracji quick-start.Jak uzyskać dostęp do konfiguracji aplikacji Zend Framework ze sterownika?

Dostałem dema pracujące i jestem teraz na etapie tworzenia nowej klasy modeli do wykonania prawdziwej pracy. W moim kontroler chcę przekazać parametr konfiguracyjny (określonej w application.ini) do mojego modelu konstruktora, coś takiego:

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

Powyższy przykład ma umożliwić dostęp do opcji, ale wydaje się bardzo o okrągłym . Czy istnieje lepszy sposób dostępu do konfiguracji?

Odpowiedz

47

Zawsze dodaje następującą metodę init do mojego bootstrap, aby przekazać konfigurację do rejestru.

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

Pozwoli to skrócić kod trochę:

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

To zajmie trochę pracy, aby ponownie przeanalizować tablicę w obiekcie. Jeśli wolisz mieć konfigurację jako tablicę, to po prostu "Zend_Registry :: set" ("config", $ this-> getOptions()); " ale zanim uzyskasz wartość, musisz ją pobrać do zmiennej. –

+0

@Alister: Masz rację, szybszym sposobem będzie przechowywanie tablicy opcji wewnątrz rejestru - ale przechowywanie tablicy za każdym razem, gdy chcesz odzyskać pojedynczą wartość, może być uciążliwe. –

+2

To nie różni się od idei $ GLOBALS ['application'] poniżej, z dodatkową korzyścią, że $ GLOBALS ['application'] działa prawdopodobnie w 99% przypadków. –

6

Alternatywnie, zamiast korzystania Zend_Registry Można też utworzyć singleton klasy aplikacji, który będzie zawierał wszystkie informacje o aplikacji, z funkcji członka publicznych, które umożliwiają aby uzyskać dostęp do odpowiednich danych. Poniżej można znaleźć fragment z odpowiednim kodem (nie będzie działać jak jest, po prostu daje wyobrażenie, jak może być wdrożone):

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

Twój bootstrap będzie wyglądać następująco:

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

Jeżeli chcesz uzyskać dostęp do konfiguracji należy użyć następujących:

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

mam zdefiniować krótką rękę w jakimś miejscu ja require_once() na początku boostrap:

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

aw bootstrap mam:

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

wtedy mogę dostać instancji aplikacji w dowolnym miejscu za pomocą:

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

W większości aplikacji ZF, obiekt aplikacji jest zadeklarowanym w zasięg globalny (patrz public/index.php w aplikacjach utworzonych za pomocą ZFW_DISTRIBUTION/bin/zf.sh).

To nie jest dokładnie droga ZF, ale można uzyskać dostęp do obiektu za pomocą $GLOBALS['application']. To trochę przypomina oszustwo, ale jeśli masz ochotę na występ, prawdopodobnie będzie to najszybsza opcja.

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

Zawsze można ominąć ramy i wszystkie ich abstrakcje. Rozwiązaniem takim jak ten powinno być hackowanie typu all-else-fail, a nie rozwiązanie typu "go-to". Wydajność w żadnym wypadku nie jest krytyczna; Zmienna konfiguracyjna nie musi być pobierana wewnątrz pętli krytycznej pod względem wydajności. –

+0

Co to jest My_Model_Manager? – zardilior

+0

@zardilior moje najlepsze przypuszczenie (4 lata) jest to, że jest to hipotetyczna klasa user-land, która zależy od hipotetycznej opcji użytkownika "my". Oba są pochlebne z pytania SO ;-) –

21

Od wersji 1.8 można użyć poniższy kod w kontrolerze:

$my = $this->getInvokeArg('bootstrap')->getOption('my'); 
1
$this->getInvokeArg('bootstrap')->getOptions(); 
// or 

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

bardzo prosty sposób, aby uzyskać dostęp do opcji konfiguracyjnych jest przez bezpośredniego dostępu globalnie zdefiniowane $ aplikację zmienna.

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