Zend Framework Tutorial Teil 8: Konfiguration mit Zend_Config

Im siebten Teil vom Zend Framework Tutorial haben wir uns ein wenig intensiver mit Zend_Controller, Zend_Db und Zend_View auseinander gesetzt und unsere Anwendung navigierbarer und mit Hilfe von CSS auch ein wenige hübscher gemacht. Wenn du die ersten sieben Teile noch nicht gelesen hast, hole dies bitte schnell nach.

In diesem achten Teil des Tutorials widmen wir uns nun einer neuen Komponente. An mehreren Stellen in unserer Applikation haben wir bereits verschiedene Konfigurationsdaten eingeführt. Es macht jedoch sehr viel Sinn, alle Konfigurationsdaten an einer zentralen Stelle abzulegen und von überall aus zugreifbar zu machen. Dabei hilft uns die Komponente Zend_Config. Außerdem werden wir unsere Applikation auch heute noch ein wenig mehr aufräumen und zwei Bugs fixen.

Wenn du über neue Tutorial Teile informiert werden möchtest, abonniere am besten den Feed dieses Blogs. Dann verpasst du garantiert keinen Teil des Tutorials.

Wichtig: Dieses Tutorial setzt die Zend Framework Preview Version 0.2.0 voraus und kann bei der Verwendung einer aktuelleren Version aus dem SVN unter Umständen nicht zu 100% funktionieren.

Inhaltsverzeichnis

Zend_Config

Als Einführung in die Zend_Config Komponente empfehle ich dir, erst einmal einen kurzen Blick in das Zend_Config Kapitel im Manual zu werfen. Dort erfährst du schon ein wenig über die Funktionsweise von Zend_Config.

Für das Einlesen der Konfigurationsdaten stellt Zend_Config mehrere Ladeklassen bereit. So können die Daten aus einem PHP Array, einer .ini Datei oder einer XML Datei gelesen und in einem Zend_Config Objekt für die Anwendung bereit gestellt werden.

Es kann sogar auf so genannte "Sections" zugegriffen werden, um bestimmte Bereiche einer Konfigurationsdatei zu laden. Dadurch können z.B. die Zugriffsdaten für eine Datenbank für die Entwicklung und die Produktion in der selben Datei vorgehalten werden.

Eine beispielhafte .ini Konfigurationsdatei könnte wie folgt aussehen:

[production]
base_url  = /my/base/url

database.type     = pdo_mysql
database.host     = db.example.com
database.username = dbuser
database.password = secret
database.name     = dbname
colours.website.green = 00FF00
colours.website.blue  = 0000FF

colours.navi.green = 00CC00
colours.navi.blue  = 0000CC

[development : production]
database.host     = db-dev.example.com

Das Laden sähe dann wie folgt aus:

PHP:
  1. $config = new Zend_Config_Ini('/path/to/config.ini', 'production');

Nach dem Laden der Konfigurationsdaten kann dann sehr einfach auf selbige zugegriffen werden. Dabei sind auch beliebig tiefe Verschachtelungen möglich, wie diese Beispiele zeigen. Außerdem steht die Methode asArray() bereit, um ein Array zurückzugeben:

PHP:
  1. echo $config->base_url;
  2. echo $config->database->host;
  3. echo $config->colours->website->green;
  4.  
  5. $database = $config->database->asArray();

Für detailliertere Informationen zu Zend_Config möchte ich nochmals auf das Manual hinweisen.

Eine .ini Konfigurationsdatei erstellen

Als erstes müssen wir einmal schauen, welche Daten sich dazu anbieten, dass sie zentral in einer Konfigurationsdatei abgelegt werden. Primär sind diese Daten bisher in unserer Bootstrap Datei enthalten. Es bieten sich vor allem die verschiedenen Verzeichnispfade, die Datenbankparameter und die Routen an.

Lege also nun im Verzeichnis "/application/config" die Datei "settings.ini" mit folgendem Inhalt an:

[production]
# Settings for the Zend Framework
framework.application_dir = /path/to/travelloblog/application
framework.controller_dir  = /path/to/travelloblog/application/controllers
framework.model_dir       = /path/to/travelloblog/application/models
framework.view_dir        = /path/to/travelloblog/application/views
framework.view_helper_dir = /path/to/travelloblog/library/zf/Travello/View\Helper

# Settings for the database
database.adapter = PDO_MYSQL
database.params.host     = my.host.de
database.params.username = secret
database.params.password = muchmorsecret
database.params.dbname   = travelloblog

[development : production]
# Settings for the Zend Framework
framework.application_dir = e:\travelloblog\application
framework.controller_dir  = e:\travelloblog\application\controllers
framework.model_dir       = e:\travelloblog\application\models
framework.view_dir        = e:\travelloblog\application\views
framework.view_helper_dir = e:\travelloblog\library\zf\Travello\View\Helper

# Settings for the database
database.adapter = PDO_MYSQL
database.params.host     = 127.0.0.1
database.params.username = root
database.params.password =
database.params.dbname   = travelloblog

In dieser Datei habe ich sowohl die Daten für unseren Entwicklungsrechner als auch für den Produktionsserver abgelegt.

Übrigens brauchst du dir keine Sorgen machen, dass jemand fälschlicherweise diese .ini Datei direkt über den Browser anzeigen lassen kann. Dies haben wir durch unsere ".htaccess" Datei im Verzeichnis "/application" bereits ausgeschlossen.

Datei settings.php anlegen

Natürlich können wir die Konfigurationsdaten auch direkt in unserer Bootstrap Datei laden. Ich habe mir jedoch angewöhnt, das Laden von Konfigurationsdaten in eine eigene Datei auszulagern. Das macht die Bootstrap Datei übersichtlicher und eventuelle Sicherheitsprobleme beim fehlerhaften Ausliefern der Bootstrap Datei werden auch umgangen.

Lege also nun im Verzeichnis "/application/config" die Datei "settings.php" mit folgendem Inhalt an:

PHP:
  1. <?php
  2. $iniFile = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'settings.ini';
  3. $config = new Zend_Config_Ini($iniFile, 'development');
  4. Zend::register('config', $config);
  5.  
  6. Zend::dump($config->asArray());
  7. ?>

Wir laden also die Daten aus der Konfigurationsdatei "settings.ini" und legen das Zend_Config Objekt im Objektspeicher ab. Danach geben wir zum Testen einmal alle Daten aus.

Da du diese Datei nicht direkt über den Browser aufrufen kannst, müssen wir sie nun noch in unserer Bootstrap Datei einbinden. Öffnen also die Datei "index.php" im Verzeichnis "/public" und ändere sie wie folgt:

PHP:
  1. <?php
  2. [...]
  3.  
  4. require_once('set_include_path.php');
  5.  
  6. require_once 'Zend.php';
  7.  
  8. require_once 'settings.php';
  9.  
  10. function __autoload($class)
  11. {
  12.     Zend::loadClass($class);
  13. }
  14.  
  15. [...]
  16. ?>

Wenn du nun das TravelloBlog im Browser aufrufst, sollte oben folgende Ausgabe erscheinen:

array(2) {
  ["framework"] => array(5) {
    ["application_dir"] => string(27) "e:\travelloblog\application"
    ["controller_dir"] => string(39) "e:\travelloblog\application\controllers"
    ["model_dir"] => string(34) "e:\travelloblog\application\models"
    ["view_dir"] => string(33) "e:\travelloblog\application\views"
    ["view_helper_dir"] => string(47) "e:\travelloblog\library\zf\Travello\View\Helper"
  }
  ["database"] => array(2) {
    ["adapter"] => string(9) "PDO_MYSQL"
    ["params"] => array(4) {
      ["host"] => string(9) "127.0.0.1"
      ["username"] => string(4) "root"
      ["password"] => string(0) ""
      ["dbname"] => string(12) "travelloblog"
    }
  }
}

Du kannst gerne auch einmal ausprobieren, was angezeigt wird, wenn du das "development" beim Erstellen des Zend_Config Objektes durch "production" austauscht. Entferne danach wieder die Ausgabe der Konfigurationsdaten aus der "settings.php" Datei.

Bootstrap Datei entschlacken

Wie weiter oben bereits erwähnt, habe ich es mir angewöhnt, die Bootstrap Datei so weit wie möglich zu entschlacken und den Aufbau des Systems bzw. das Anlegen diverser Objekte in die "settings.php" auszulagern.

Entferne also als erstes den Abschnitt für die Definition der Datenbankparameter und das Anlegen des Datenbankadapters aus der Bootstrap Datei. Füge dann an das Ende der "settings.php" Datei folgende Zeilen ein:

PHP:
  1. $adapter = $config->database->adapter;
  2. $params  = $config->database->params->asArray();
  3.  
  4. $db = Zend_Db::factory($adapter, $params);
  5. Zend_Db_Table::setDefaultAdapter($db);

Lade das TravelloBlog im Browser neu und es sollte weiterhin wie gewünscht funktionieren.

Als nächstes entferne bitte den Codeblock für das Erstellen des Zend_Controller_RewriteRouter Objektes bis zum Ablegen im Objektspeicher aus der Bootstrap Datei und füge es an das Ende der "settings.php" Datei wieder ein:

PHP:
  1. $route1 = new Zend_Controller_Router_Route(':controller/:action/:id', array('controller' => 'article', 'action' => 'index'));
  2.  
  3. $router = new Zend_Controller_RewriteRouter();
  4. $router->addRoute('actionroute', $route1);
  5. $router->setRewriteBase('')// change to '/travelloblog/public' for subdirectory
  6. Zend::register('router', $router);

Die Konfiguration der Routen könnten wir auch in die "settings.ini" Datei ablegen, jedoch würde das einiges an zusätzlicher Tipparbeit ersparen und das Lesen der Routen verschlechtern. Stattdessen belassen wir es vorerst einmal dabei.

Als nächstes entferne den gesamten Codeblock vom Anlegen des Zend_View Objektes bis zum Ablegen im Objektspeicher aus der Bootstrap Datei und füge ihn leicht abgeändert an das Ende der "settings.php" Datei wieder ein:

PHP:
  1. $view = new Zend_View();
  2. $view->setScriptPath($config->framework->view_dir);
  3. $view->addHelperPath($config->framework->view_helper_dir);
  4.  
  5. $baseurl = $router->getRewriteBase();
  6. $view->assign('baseurl', $baseurl);
  7.  
  8. Zend::register('view', $view);

Jetzt sieht unsere Bootstrap Datei schon übersichtlicher aus, doch wir können noch weiter gehen. Bitte entschlacke deine Bootstrap Datei nun soweit, dass nur noch diese wenigen Zeilen enthalten sind:

PHP:
  1. <?php
  2. require_once 'settings.php';
  3.  
  4. $controller = Zend_Controller_Front::getInstance();
  5. $controller->setRouter($router);
  6. $controller->setControllerDirectory($config->framework->controller_dir);
  7. $controller->dispatch();
  8. ?>

Die eben entfernten Zeilen füge nun an den Anfang der "settings.php" Datei ein:

PHP:
  1. require_once 'set_include_path.php';
  2.  
  3. require_once 'Zend.php';
  4.  
  5. function __autoload($class)
  6. {
  7.     Zend::loadClass($class);
  8. }

Ein erneutes Laden des TravelloBlogs im Browsers sollte dir zeigen, dass weiterhin alles funktioniert. Die Bootstrap Datei ist nun sehr kurz und enthält nur das wesentliche. Das Laden der Konfigurationseinstellungen und das Anlegen aller benötigten Objekte ist nun in der "settings.php" ausgelagert.

Die gesamte settings.php Datei

Es macht nun eigentlich keinen großen Sinn mehr, für das setzen des "include_path" eine eigene Datei vor zuhalten, so dass du als nächstes die Codezeilen aus der Datei "set_include_path.php" an den Anfang der "settings.php" Datei kopieren und die Datei "set_include_path.php" löschen kannst.

Um mit Hilfe von Zend_Config automatisch die richtigen Konfigurationsdaten für den Entwicklungsrechner und den Liveserver zu laden, ändere den Aufruf nun noch wie folgt ab:

PHP:
  1. $iniFile = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'settings.ini';
  2. $section = (in_array($_SERVER['HTTP_HOST'], array('travelloblog', 'localhost'))) ? 'development' : 'production';
  3. $config = new Zend_Config_Ini($iniFile, $section);
  4. Zend::register('config', $config);

Deine komplette "settings.php" Datei sollte nun wie folgt aussehen:

PHP:
  1. <?php
  2.  
  3. $include_path = 'e:\travelloblog\library\zf' . PATH_SEPARATOR;
  4. $include_path.= 'e:\travelloblog\application\models' . PATH_SEPARATOR;
  5. $include_path.= get_include_path();
  6. set_include_path($include_path);
  7.  
  8. require_once 'Zend.php';
  9.  
  10. function __autoload($class)
  11. {
  12.     Zend::loadClass($class);
  13. }
  14.  
  15. $iniFile = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'settings.ini';
  16. $section = (in_array($_SERVER['HTTP_HOST'], array('travelloblog', 'localhost'))) ? 'development' : 'production';
  17. $config = new Zend_Config_Ini($iniFile, $section);
  18. Zend::register('config', $config);
  19.  
  20. $adapter = $config->database->adapter;
  21. $params  = $config->database->params->asArray();
  22.  
  23. $db = Zend_Db::factory($adapter, $params);
  24. Zend_Db_Table::setDefaultAdapter($db);
  25.  
  26. $route1 = new Zend_Controller_Router_Route(':controller/:action/:id', array('controller' => 'article', 'action' => 'index'));
  27.  
  28. $router = new Zend_Controller_RewriteRouter();
  29. $router->addRoute('actionroute', $route1);
  30. $router->setRewriteBase('')// change to '/travelloblog/public' for subdirectory
  31. Zend::register('router', $router);
  32.  
  33. $view = new Zend_View();
  34. $view->setScriptPath($config->framework->view_dir);
  35. $view->addHelperPath($config->framework->view_helper_dir);
  36.  
  37. $baseurl = $router->getRewriteBase();
  38. $view->assign('baseurl', $baseurl);
  39.  
  40. Zend::register('view', $view);
  41. ?>

Du kannst nun auch andere Konfigurationsdaten, die du in deinem Projekt benötigst, in der "settings.ini" Datei ablegen. Wann immer du auf diese Daten zugreifen möchtest, kannst du dir das Zend_Config Objekt aus dem Objektspeicher holen und direkt darauf zugreifen:

PHP:
  1. $config = Zend::registry('config');

Da das Thema Zend_Config nun vorerst abgeschlossen ist, wenden wir uns nun noch einige Aufräumarbeiten zu.

Aufräumarbeiten

Wir haben bereits an mehreren Stellen den kleinen Bugfix für das Holen der RewriteBase eingefügt. Es macht durchaus Sinn dafür eine globale Funktion einzuführen, die wir dann später auch entsprechend anpassen können, wenn wir den Bugfix nicht mehr benötigen.

Erstelle also in deiner "settings.php" Datei noch die folgende Funktion:

PHP:
  1. [...]
  2.  
  3. function getRewriteBase()
  4. {
  5.     $url = Zend::registry('router')->getRewriteBase();
  6.    
  7.     return $url;
  8. }
  9.  
  10. [...]

Weiter unten in der "settings.php" Datei kannst du dann diese Funktion verwenden:

PHP:
  1. [...]
  2.  
  3. $view = new Zend_View();
  4. $view->setScriptPath($config->framework->view_dir);
  5. $view->addHelperPath($config->framework->view_helper_dir);
  6. $view->assign('baseurl', getRewriteBase());
  7. Zend::register('view', $view);
  8.  
  9. [...]

In den Controllern ArticleController, TagController und CategoryController kannst du nun die private Methode "getRewriteBase" jeweils entfernen und die Aufrufe von "$this->getRewriteBase()" in "getRewriteBase()" abändern. Das führe ich jetzt hier nicht im Detail auf.

Im ArticleController kannst du nun auch die Methoden listStartpageAction, listCategoryAction und listTagAction entfernen, da wir diese doch nicht benötigen. Die Anzeige aller Artikel auf der Startseite sowie für eine Kategorie oder einen Tag haben wir bereits realisiert.

Zentrale 404 Fehlerseite einrichten

Bisher geben unsere __call Methoden in unseren Controllern nur einen kurzen Text aus. Besser wäre es natürlich, wenn alle fehlerhaften Anfragen direkt auf eine zentrale Fehlerseite umgeleitet werden. Diese zentrale Fehlerseite sollte in unserem IndexController aufbereitet werden.

Öffne nun also die Datei "IndexController" im Verzeichnis "/application/controllers" und ändere den vorhandenen Code wie folgt ab:

PHP:
  1. <?php
  2. class IndexController extends Travello_Controller_Action
  3. {
  4.     public function indexAction()
  5.     {
  6.         $url = getRewriteBase() . '/article';
  7.        
  8.         $this->_redirect($url);
  9.     }
  10.    
  11.     public function norouteAction()
  12.     {
  13.         $this->_view->assign('title', 'TravelloBlog - file not found');
  14.         $this->_view->assign('subtemplate', '404.php');
  15.  
  16.         header("Status: 404 Not Found");
  17.     }
  18.    
  19.     public function __call($methodName, $args)
  20.     {
  21.         $url = getRewriteBase() . '/noroute';
  22.        
  23.         $this->_redirect($url);
  24.      }
  25. }
  26. ?>

In der indexAction Methode wird bei einem direkten Aufruf des IndexControllers über den Browser auf den ArticleController umgeleitet. Die Methode norouteAction gibt unsere Fehlerseite sowie den Status Code 404 aus und unsere __call Methode leitet alle fehlerhaften Anfragen auf die 404 Fehlerseite um.

Damit das funktioniert, musst du nun noch im Verzeichnis "/application/views" die Datei "404.php" anlegen:

PHP:
  1. <h2>404 - An error occured</h2>
  2. <p>You tried to access a page that does not exist on this server.</p>
  3. <hr>
  4. <a href="/">back to start page</a>

Wenn du nun irgendeine nicht vorhandene Seite aufrufen möchtest, sollte dir die Fehlerseite ausgegeben werden. Jetzt kannst du in allen Controllern die Methode __call entsprechend wie im IndexController anpassen. Auch diese Änderungen führe ich nicht im Detail auf.

Bugfixing

Im letzten Teil haben sich zwei kleine Bugs eingeschlichen. Und zwar werden beim Validieren eines Artikels bereits ausgewählte Kategorien und Tags nicht mehr als selektiert angezeigt. Du kannst das Problem nachstellen, indem du einen neuen Artikel anlegst, dabei Kategorien und Tags auswählst, aber keinen Titel angibst und auf Speichern klickst. Dann sollten beim Verifizieren deine ausgewählten Kategorien und Tags nicht mehr selektiert sein.

Ändere im ArticleController die Methoden createAction und changeAction wie folgt ab:

PHP:
  1. <?php
  2.     public function createAction()
  3.     {
  4.         [...]
  5.  
  6.         $params['article']['art_text'  ] = '';
  7.         $params['article']['art2cat_cat_id'] = array();
  8.         $params['article']['art2tag_tag_id'] = array();
  9.        
  10.         [...]
  11.     }
  12.    
  13.     public function changeAction()
  14.     {
  15.         [...]
  16.  
  17.         $params['title'] = 'TravelloBlog - Update article';
  18.        
  19.         $params['article']['art2cat_cat_id'] = $this->getCategories($art_id);
  20.         $params['article']['art2tag_tag_id'] = $this->getTags($art_id);
  21.        
  22.         [...]
  23.     }
  24. ?>

In der Datei "form.php" im Verzeichnis "/application/views/article" musst du auch zwei kleine Änderungen machen:

PHP:
  1. [...]
  2.  
  3. <?php if (isset($this->errors['art2cat_cat_id'])) : ?><div class="error"><?php endif; ?>
  4. <?php echo $this->formSelect('art2cat_cat_id', $this->article['art2cat_cat_id'], array('id' => 'art2cat_cat_id', 'size' => 3, 'multiple' => 'multiple'), $this->categories); ?>
  5. <?php if (isset($this->errors['art2cat_cat_id'])) : ?><br/><?php echo $this->escape($this->errors['art2cat_cat_id']); ?></div><?php endif; ?>
  6.  
  7. [...]
  8.  
  9. <?php if (isset($this->errors['art2tag_tag_id'])) : ?><div class="error"><?php endif; ?>
  10. <?php echo $this->formSelect('art2tag_tag_id', $this->article['art2tag_tag_id'], array('id' => 'art2tag_tag_id', 'size' => 5, 'multiple' => 'multiple'), $this->tags); ?>
  11. <?php if (isset($this->errors['art2tag_tag_id'])) : ?><br/><?php echo $this->escape($this->errors['art2tag_tag_id']); ?></div><?php endif; ?>
  12.  
  13. [...]

Danach sollte dieser Bug bereinigt sein.

Ein zweiter Bug tritt beim Löschen eines Artikels auf. Es werden dann die Einträge in den Tabellen "art2cat" und "art2tag" nicht für den zu löschenden Artikel entfernt. Um das Problem zu lösen, musst du die Methode doDeleteAction im ArticleController entsprechend anpassen:

PHP:
  1. <?php
  2.     public function doDeleteAction()
  3.     {
  4.         [...]
  5.        
  6.         $article->delete($where);
  7.        
  8.         $art2tag = new Art2tagModel();
  9.         $where = $db->quoteInto('art2tag_art_id = ?', $art_id);
  10.         $art2tag->delete($where);
  11.        
  12.         $art2cat = new Art2catModel();
  13.         $where = $db->quoteInto('art2cat_art_id = ?', $art_id);
  14.         $art2cat->delete($where);
  15.        
  16.         $url = getRewriteBase() . '/';
  17.        
  18.         $this->_redirect($url);
  19.     }
  20. ?>

Danach sollte auch dieser Bug erledigt sein. Das war es dann auch für dieses Mal. Ausnahmsweise gibt es heute einmal keine Übung.

Download

Der aktuelle Stand des Tutorials nach diesem sechsten Teil kann herunter geladen werden. Hier sind auch alle Templates enthalten. Die Textdateien "empty.txt" in einigen Verzeichnissen habe ich nur angelegt, weil mein Winzip keine leeren Verzeichnisse im Zip Archiv anlegt:

Die Zip Datei enthält nicht die aktuelle Version des Zend Frameworks. Dies musst du bitte selber in das entsprechende Verzeichnis kopieren.

Zusammenfassung

In diesem achten Teil des Zend Framework Tutorials haben wir die Zend_Config Komponente kennen gelernt und für unser Projekt eingesetzt. Wir haben die Bootstrap Datei stark entschlackt und sämtlichen Code für das Einlesen der Konfigurationsdaten und das Anlegen und Ablegen der Objekte im Objektspeicher in eine separate Datei ausgelagert. Zudem haben wir noch ein wenig aufgeräumt und zwei Bugs bereinigt.

Im nächsten Teil des Tutorials werden wir uns dem Filtern von Benutzereingaben widmen und dabei die Zend_Filter_Input Komponente kennen lernen. Ich habe mich jetzt auch entschieden, die Reihenfolge des Tutorials weiter zu ändern. So werden die beiden geplanten Exkurse zur Integration von Smarty und eZ components an das Ende des Tutorials gestellt. Erst soll die Pflicht kommen, danach dann die Kür... ;-)

Change Log

An dieser Stelle werden Änderungen an diesem Tutorial Teil zusammengefasst, die nach dem Ersterscheinen (09.10.2006) notwendig waren, z.B. durch neuere Versionen des Zend Frameworks oder Änderungen am Konzept des Tutorials oder den Anforderungen an unser TravelloBlog.

  • 05.11.2006: Tutorial für Release 0.2.0 angepasst

Navigation

11 Antworten für “Zend Framework Tutorial Teil 8: Konfiguration mit Zend_Config”

  1. Ralfs PHP Blog » Zend Framework Tutorial Teil 7: MVC Design Pattern für weitere Controller sagt:

    [...] Zend Framework Tutorial, Zend Controller RewriteRouter, Zend View Bookmark: del.icio.us yigg.de mister-wong.de  [...]

  2. Ralfs PHP Blog » Zend Framework Tutorial Teil 9: Benutzereingaben filtern mit Zend_Filter_Input sagt:

    [...] Im achten Teil vom Zend Framework Tutorial haben wir die Zend_Config Komponente für das Laden unsere Konfigurationsdaten verwendet, unsere Bootstrap Datei stark entschlackt und noch ganz nebenbei zwei Bugs aus dem siebten Teil bereinigt. Wenn du die ersten acht Teile noch nicht gelesen hast, hole dies bitte schnell nach. [...]

  3. Ralfs PHP Blog » Zend Framework Tutorial Teil 1: Einführung und Anforderungen sagt:

    [...] Konfiguration mit Zend_Config [...]

  4. Gregor sagt:

    Hallo Ralf!

    Mich verwirrt der Aufruf "require_once 'settings.php';" in der Bootstrap-Datei.

    Das führt doch logischer Weise zu einem Fehler, da sich Die Datei settings.php in einem anderen Ordner als die Bootstrap-Datei befindet und an keiner Stelle der include_path entsprechend angepasst wird.

    PS: Vielen dank für das ausführliche Zend Framework-Tutorial und deinen Einsatz bei ZF! Ich bin gespannt ob das Zend Framework ähnlich mächtig wird wie das Ruby on Rails Framework.

  5. Ralf Eggert sagt:

    Hallo Gregor,

    in diesem Abschnitt hier, haben wir für das Config Verzeichnis die php.ini angepasst:

    http://www.ralfeggert.de/2006/08/28/systemaufbau-mit-bootstrap-datei-und-der-zend-basisklasse/#include_path

    Deshalb sollte das require_once 'settings.php'; ohne Probleme funktionieren.

    Ich hoffe mal, dass das Zend Framework sich weiter entwickelt und eines Tages eine grosse Nutzergemeinde findet. Bis zum Release 1.0 ist zwar noch ein langer Weg, aber ich hoffe, dass die Version wirklich im Frühjahr erscheinen wird.

    Gruß,

    Ralf

  6. Gregor sagt:

    vielen Dank! Der Fehler lag bei mir.

  7. Stoyanov sagt:

    Hallo Ralf,

    anscheinend habe ich mir heute den falschen Tag ausgesucht um mit ZF anzufangen. Neue Version -> Zend-Docu somit veraltet ;)

    Das Laden von "Zend_Config" klappt nicht mehr. Soweit ich den SRC von ZF das entnehmen kann, sollte das hier helfen

    - $config = new Zend_Config(Zend_Config_Ini::load($iniFile, $section));
    + $config = new Zend_Config_Ini($iniFile, $section);

    Denke mal - es gibt ne andere bessere Lösung ;) Für mich hat es bis jetzt funktioniert.

    Grüße
    Stoyanov

  8. Ralf Eggert sagt:

    Hallo Stoyanov,

    ne, das ist schon der neue Weg, wenn ich mich recht erinnere. Ich hoffe, ich komme bald dazu, dass Tutorial an die Änderungen anzupassen. Wahrscheinlich muss ich dann aber zusätzlich eine Upgrade Anleitung erstellen. Momentan ist die Zeit jedoch ein wenig knapp.

    Gruß,

    Ralf

  9. Stefan sagt:

    Hallo Ralf,

    du verwendest in deinem Tutorial die Config Ladeklasse Zend_Config_Ini.
    Es stehen - wie du ja erwähnst - noch die Zend_Config_Array und Zend_Config_Xml als weitere Möglichkeiten offen.

    Welche Vor- und Nachteile kannst du jeweils in den insgesamt zur Verfügung stehenden Laseklassen sehen? Welche eignet sich wofür eher besser oder eben schlechter?

    Danke für deine Arbeit!

    Gruß
    Stefan

  10. Ralf Eggert sagt:

    Halle Stefan,

    also Zend_Config_Array gibt es seit Release 0.2.0 nicht mehr. Stattdessen kann man nun direkt an den Konstruktor von Zend_Config das Array übergeben. Im grossen und ganzen ist es Geschmackssache, welche Variante man wählt. Es hängt auch davon ab, wer die Kondigurationsdaten pflegen soll und wie gut dieser mit Ini/XML/PHP Array Dateien umgehen kann.

    Gruß,

    Ralf

  11. Bleistift sagt:

    Hallo,

    ich hab ein kleines Problem. Bei mir wird immer die IndexController::norouteAction() aufgerufen. Egal was ich eingebe... Woran kann das liegen?

    Gruss

Hinterlasse eine Antwort