Mehrere Konfigurationsdateien mit Zend_Application laden

Zend_Application bietet eine elegante Möglichkeit seine Zend Framework-Projekte zu initialisieren. Im Allgemeinen sieht die Instanziierung des Zend_Application-Objekts so aus:

$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);

Das 2. Argument des Konstruktors erwartet ein Array/Zend_Config-Objekt oder häufiger, wie hier im Beispiel verwendet, einen Pfad zu einer Konfigurationsdatei. Was aber nun wenn man mehrere Konfigurationsdateien laden möchte?

Seit Version 1.10 erlaubt Zend_Application im Array-Argument einen Eintrag mit dem Schlüssel “config”. Der Wert kann ein Array mit beliebig vielen Pfaden zu Konfigurationsdateien sein:

$application = new Zend_Application(
    APPLICATION_ENV,
    array(
        'config' => array(
            '/path/to/file1.ini',
            '/path/to/file2.ini',
        )
    )
);

Da ich in meinen Projekten neben der normalen Webanwendung auch Kommandozeilen-Skripte habe, lassen sich so einfach zusätzliche Konfigurationsdateien für den jeweiligen Kontext laden.

In meiner application.ini stehen bei mir nur noch allgemeine Konfigurations-Optionen wie z.B. für die Datenbankverbindung oder PHP-Settings. Dazu habe ich 2 weitere Konfigurationsdateien: http.ini und cli.ini.

So würde bei mir die application.ini aus dem Quickstart aufgeteilt werden:

application.ini

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.db.adapter = "PDO_SQLITE"
resources.db.params.dbname = APPLICATION_PATH "/../data/db/guestbook.db"
 
[staging : production]
 
[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.db.adapter = "PDO_SQLITE"
resources.db.params.dbname = APPLICATION_PATH "/../data/db/guestbook-testing.db"
 
[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.db.adapter = "PDO_SQLITE"
resources.db.params.dbname = APPLICATION_PATH "/../data/db/guestbook-dev.db"

http.ini

[production]
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 0
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"
resources.view[] =
 
[staging : production]
 
[testing : production]
 
[development : production]
resources.frontController.params.displayExceptions = 1

In der http.ini stehen die Optionen für View-, Layout-, Frontcontroller-Resourcen etc. und andere Web-spezifische Angaben.

cli.ini

[production]
 
[staging : production]
 
[testing : production]
 
[development : production]

In der cli.ini stehen alle CLI-spezifischen Angaben.

Meine public/index.php lädt dann application.ini und http.ini:

<?php
// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
 
// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
 
// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));
 
/** Zend_Application */
require_once 'Zend/Application.php';
 
// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    array(
        'config' => array(
            APPLICATION_PATH . '/configs/application.ini',
            APPLICATION_PATH . '/configs/http.ini',
        )
    )
);
$application->bootstrap()
            ->run();

Und ein (mögliches) Kommandozeilen-Skript sähe dann so aus:

#!/usr/bin/env php
<?php
// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
 
// Define application environment
if (!defined('APPLICATION_ENV')) {
    if (getenv('APPLICATION_ENV')) {
        define('APPLICATION_ENV', getenv('APPLICATION_ENV'));
    } else {
        if (preg_match('/\/(staging|production)+\//', __FILE__, $matches)) {
            define('APPLICATION_ENV', $matches[1]);
        } else {
            define('APPLICATION_ENV', 'development');
        }
    }
}
 
// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));
 
/** Zend_Application */
require_once 'Zend/Application.php';
 
// Create application, bootstrap
$application = new Zend_Application(
    APPLICATION_ENV,
    array(
        'config' => array(
            APPLICATION_PATH . '/configs/application.ini',
            APPLICATION_PATH . '/configs/cli.ini',
        )
    )
);
$application->bootstrap();
 
// Do some work here

Links zum Thema