PDA

Vollständige Version anzeigen : Registry und beispiel Config


seratio
20.06.2007, 03:22
Moin moin,

ich hab gerade ein kleines problemchen und zwar folgendes:

in der index.php steht dieser abschnitt:
$config = new Zend_Config_Ini('./application/config.ini', 'general');
$registry = Zend_Registry::getInstance();
$registry->set('config', $config);und ich moechte nun innerhalb eines controllers auf eine bestimmte variable aus der config zugreifen. bis jetzt hab ich das so gemacht:

<?php

class IndexController extends Zend_Controller_Action
{
function init()
{
$this->view->baseUrl = $this->_request->getBaseUrl();
$this->config = Zend_Registry::get('config');
}

function indexAction()
{
$this->view->title = $this->config->site->title . " IndexController::indexAction";
}
}geht das ganze evtl noch anders?? oder kann ich z.b. mein beispiel abaendern, so das ich nicht in jeden controller
$this->view->title = $this->config->site->title . " IndexController::indexAction"; schreiben muss?
sondern nur noch
$this->view->title .= " IndexController::indexAction";was mich nervt sind atm einfach beide zeilen aus init()... geht das nicht iwie anders?

MfG
Alex

Blackflash
20.06.2007, 07:13
Wo wird eine Instanz von $this->view erstellt? Ansonsten könntest du das in einem eigenen Basiscontroller implementieren.

sage2k1
20.06.2007, 08:46
$config = new Zend_Config_Ini('./application/config.ini', 'general');
$registry = Zend_Registry::getInstance();
$registry->set('config', $config);

Mich würde zu der Verwendung der Registry mal interessieren, welchen Vorteil es hat erst eine Instanz davon zu erzeugen und dort dann eine Variable zu setzen (set).

Zend_Registry kann doch statisch benutzt werden. Warum dann nicht auch so tun?

Solange ich die Registry nicht mit einer foreach oder so durchlaufen möchte, ist eine Instanz doch mho unnötig. Gibt es da Vor- oder Nachteile?

ShoX
20.06.2007, 10:17
"Solange ich die Registry nicht mit einer foreach oder so durchlaufen möchte, ist eine Instanz doch mho unnötig. Gibt es da Vor- oder Nachteile?"

nein. (afaik)

seratio
20.06.2007, 10:53
Wo wird eine Instanz von $this->view erstellt? Ansonsten könntest du das in einem eigenen Basiscontroller implementieren.zend view braucht keine instanze das funzt auch ohne innerhalb eines controllers ;)

okay ich hab das jetzt geaendert ;) statt
$config = new Zend_Config_Ini('./application/config.ini', 'general');
$registry = Zend_Registry::getInstance();
$registry->set('config', $config); einfach
$config = new Zend_Config_Ini('./application/config.ini', 'general');
Zend_Registry::set('config', $config);


und eigener BasisController ging genau wie?... einfach ne klasse die Zend_Controller_Action extendet und alle anderen controller werden von der neuen basisklasse abgeleitet?

KingCrunch
20.06.2007, 11:42
Das View-Objekt wird vom viewRenderer erstellt ;)

Blackflash
20.06.2007, 12:26
Okay, wieder etwas dazugelernt. ;-) Muss dazu aber auch sagen, dass ich den ViewRenderer (noch) nicht verwende.

Sicherlich kannst du irgendwo auf diesen view zugreifen und den Standardwert dann setzen. Wenn du das ohne viel Aufwand schaffst, ist es sinnvoller als eine neue Basisklasse zu schreiben. Ansonsten schreibst du dir 'ne Basisklasse, die das vorher setzt.

seratio
20.06.2007, 13:31
Hi,
ich habs jetzt folgendermaßen gelöst:
library/System/Controller/Action.php
<?php
abstract class System_Controller_Action extends Zend_Controller_Action
{
function init(){
$this->view->baseUrl = $this->_request->getBaseUrl();
$this->config = Zend_Registry::get('config');
}

}

index.php

<?php
error_reporting(E_ALL|E_STRICT);
date_default_timezone_set('Europe/Berlin');

set_include_path('.' . PATH_SEPARATOR . './library'
. PATH_SEPARATOR . './application/models'
. PATH_SEPARATOR . get_include_path());


include 'Zend/Loader.php';

Zend_Loader::loadClass('Zend_Controller_Front');
Zend_Loader::loadClass('Zend_Config_Ini');
Zend_Loader::loadClass('Zend_Registry');
Zend_Loader::loadClass('Zend_Db');
Zend_Loader::loadClass('Zend_Db_Table');

Zend_Loader::loadClass('System_Controller_Action') ;

// load configuration
$config = new Zend_Config_Ini('./application/config.ini', 'general');
Zend_Registry::set('config', $config);

// setup database
$db = Zend_Db::factory($config->db->adapter, $config->db->config->toArray());
Zend_Db_Table::setDefaultAdapter($db);


// setup controller
$frontController = Zend_Controller_Front::getInstance();
$frontController->throwExceptions(true);
$frontController->setControllerDirectory('./application/controllers');

$frontController->dispatch();

IndexController.php
<?php

class IndexController extends System_Controller_Action
{
function indexAction()
{
$this->view->title = $this->config->site->title . " IndexController::indexAction";
//$this->render();
}
}

seratio
20.06.2007, 14:01
okay problem...

wenn ich in der library/System/Controller/Action.php
alles in die init() reinbastel... darf ich im eigentlichen indexcontroller kein init() mehr verwenden.... geht des evtl anders?

KingCrunch
20.06.2007, 14:35
Wieso darfst du das denn nicht?! Oo

seratio
20.06.2007, 14:39
weil dann die init der library/System/Controller/Action.php ueberschrieben wird? und das ist irgendwo dumm...

budcha
20.06.2007, 14:44
parent::init() in die init mit reinschreiben

seratio
20.06.2007, 15:25
danke :) funzt