Schlagwort-Archiv: zf2

Zugriff auf die Konfiguration

zf2-logo konfiguration Die Konfiguration im Zend Framework 2 zu füllen, ist nicht schwierig. Wie aber kann man auf die Konfiguration zugreifen?

Quick and dirty geht das ganz einfach:

namespace MyModule;

class Module
{
    public function getConfig()
    {
        return array(
            'my-module' => array(
                'foo' => 'bar'
            )
        );
    }
}
// Zugriff z.B. im Controller:
$config = $this->getServiceLocator()->get('Config');
echo $config['my-module']['foo']; // gibt 'bar' aus

Das funktioniert, ist aber nicht wirklich schön. Spätestens wenn man sein Modul auch anderen zugänglich machen will, müssen die sich auf die Suche nach unseren Konfigurationsmöglichkeiten machen. Wir können natürlich eine Dokumentation mit allen Möglichkeiten anlegen, aber eine Dokumentation zu schreiben macht nicht wirklich Spaß und wenn Dokumentation und Quelltext getrennt voneinander liegen, veraltet die Dokumentation schneller als man glaubt.

Wir brauchen also eine sauberer Lösung, um auf unsere Konfiguration zuzugreifen. Es bietet sich an, die Konfiguration in einem Objekt zu kapseln. Das könnte z.B. so aussehen:

namespace MyModule\Options;

use Zend\Stdlib\AbstractOptions;

class ModuleOptions extends AbstractOptions
{
    protected $foo;

    public function setFoo($value)
    {
        $this->foo = $value;
    }

    public function getFoo()
    {
        return $foo;
    }
}

Wir haben hier eine einfache Klasse, die eine Getter- und eine Setter-Methode für foo besitzt. Warum erweitern wir dafür Zend\Stdlib\AbstractOptions? Dort ist ein Konstruktor definiert, der es uns ermöglicht, die Optionen als Array zu übergeben und so direkt zu setzen. Das sieht dann ungefähr so aus:

namespace MyModule;

use MyModule\Options\ModuleOptions;
use Zend\ServiceManager\ServiceLocatorInterface as ServiceLocator;

class Module
{
    public function getConfig()
    {
        return array(
            'my-module' => array(
                'foo' => 'bar'
            )
        );
    }

    public function getServiceConfig()
    {
        return array(
            'factories' => array(
                'MyModule\Options\ModuleOptions' => function (ServiceLocator $services) {
                    $config = $services->get('Config');
                    return new ModuleOptions($config['my-module']);
                }
            )
        );
    }
}
// Zugriff z.B. im Controller:
$config = $this->getServiceLocator()->get('MyModule\Options\ModuleOptions');
echo $config->getFoo(); // gibt 'bar' aus

Wie ihr seht, haben wir durch diese paar Zeilen mehr einen sauber definierten Zugriff und einen zentralen Punkt im Code, wo sämtliche Konfigurationsmöglichkeiten für unser Modul dokumentiert sind und wo wir Standard-Werte setzen können. Das allein sollten euch diese paar Zeilen Code wert sein 🙂

ZF2 Kurztipp: Modulspezifische Layouts

zf2 kurztipps modulspezifische layouts Eine häufige Frage beim Einsatz des Zend Framework 2 ist: Wie kann ich für ein bestimmtes Modul ein anderes Layout nutzen. Rob Allen hat genau dafür ein Modul geschrieben, das ihr bequem über Composer installieren könnt.

Nun müsst ihr das Modul nur noch aktivieren, indem ihr in der application.config.php Folgendes eintragt:

return array(
    'modules' => array(
        'EpdModuleLayouts',
        // eure anderen Module
    ),
    // […]
);

Jetzt steht euch das Modul zur Verfügung und ihr könnt z.B. in einer autoload/config/layouts.php oder auch in eurer module.php die gewünschten Layouts angeben:

return array(
    'module_layouts' => array(
        'MyModule' => 'layout/my-specific-layout',
    ),
);

Für alle Module, die nicht explizit angegeben werden, wird übrigens das Standard-Layout geladen.

Verschiedene Environments mit dem ZF2

zf2 environments Die meisten Anwendungen laufen mittlerweile in verschiedenen Environments. Entwickler, die vom ZF1 auf das ZF2 umsteigen, suchen oft nach einer Möglichkeit, für die verschiedene Environments verschiedene Einstellungen zu nutzen. Im ZF1 war dies innerhalb der Datei application.ini möglich. Im ZF2 ist diese Datei nicht mehr vorhanden. Es müssen andere Möglichkeiten gesucht werden, Variablen abhängig von der Environment zu setzen.

Da die Konfiguration mittlerweile Plain-PHP ist, liegt natürlich das Abfragen einer Umgebungsvariable nahe. Das könnte dann zum Beispiel so aussehen:

return array(
    'db' => array(
        'driver' => 'Pdo',
        'dsn'            => 'mysql:dbname=example;host=localhost',
        'username'       => getenv('APP_ENV') == 'dev'
                          ? 'root'
                          : 'admin',
        'password'       => getenv('APP_ENV') == 'dev'
                          ? ''
                          : '123456',
        'driver_options' => array(
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
        ),
    )
);

Das funktioniert zwar, allerdings liefert das ZF2 von Hause aus eine bessere Möglichkeit mit: das config/autoload-Verzeichnis. Das Vorgehen ist ganz einfach: Man lege eine Datei mit den globalen Einstellungen ab, die auf global.php endet. Sie enthält die Einstellungen, die in allen Environments gleich sind. Für unser Beispiel sieht das so aus:

return array(
    'db' => array(
        'driver' => 'Pdo',
        'dsn'            => 'mysql:dbname=example;host=localhost',
        'driver_options' => array(
            PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''
        ),
    )
);

Ergänzt wird das ganze dann durch eine Datei, die auf local.php endet. Sie enthält die umgebungsspezifischen Konfigurationen. Für unsere dev-Umgebung sähe das so aus:

return array(
    'db' => array(
        'username'       => 'root',
        'password'       => '',
    )
);

Die dazugehörige .gitignore sorgt dann dafür, dass die Datei mit den umgebungsspezifischen Konfigurationen nicht im Repository landet. Dieses Vorgehen hat zwei Vorteile: Zum einen kann jeder Entwickler beliebige Konfigurationen verwenden, ohne dass sich die Konfigurationsdateien unnötig aufblähen, zum anderen landen keine sicherheitskritischen Daten im Repository.

Es ist also nicht besonders schwierig, verschiedene Environments im ZF2 zu konfigurieren. Meiner Meinung nach ist es sogar einfacher geworden, wenn man das Prinzip einmal verstanden hat.

ZF2-Kurztipp: Environment mit ZFTool testen

zf2 kurztipps zftool Während sich das Zend_Tool im Zend Framework 1 noch hauptsächlich darauf beschränkt hat, Controller und andere Klassen anzulegen, bringt sein Nachfolger, das ZFTool-Modul, für das Zend Framework 2 auch die Möglichkeit mit, seine Environment automatisch zu überprüfen. Das ganze nennt sich Diagnostics und funktioniert wahlweise über die Kommandozeile oder das Webinterface. In der Anleitung wird nicht nur das Einbinden bestehender Tests erklärt, sondern auch, wie man mit wenigen Zeilen Code eigene Tests schreibt – anschauen lohnt sich.

Zend Framework 2 Ressourcen

zf2-logo-mark
Wurde das Zend Framework 1 noch für seine gute Dokumentation gelobt, ist dies beim Nachfolger einer der größten Kritikpunkte (siehe auch der Thread zum ZF 3 auf der Mailing list). Dabei sind gute Ressourcen durchaus vorhanden, nur leider nicht immer in Form einer offiziellen Dokumentation.

Für den Anfang empfiehlt es sich dennoch, einen Blick in das offizielle Tutorial zu werfen. Auch danach ist die offizielle Dokumentation immer noch ein guter Anlaufpunkt für viele Komponenten.

Wer einen tieferen Einblick in das ZF2 gewinnen will, wird allerdings nicht drumherum kommen, sich auch außerhalb der offiziellen Dokumentation umzusehen. Für diejenigen, die sich gerne berieseln lassen, bietet Zend einige Webinare an, die aber natürlich nicht all-umfassend sind.

Ein „Must-Follow“ für alle engagierten ZF2-Entwickler sollte hingegen die Featured-Blogs sein, die leider etwas schwer zu finden sind. Wer diese Blogs noch nicht in seinem RSS-Reader hat, sofort nachholen!

Für all diejenigen, welche die englische Sprache scheuen (und das scheinen mir im deutschsprachigen Raum immer noch relativ viele zu sein) gibt es noch das Zend Framework Magazin von Ralph Eggert, in dem mittlerweile auch viele deutsche Artikel zu finden sind. Apropos Ralph Eggert, wer gerne Bücher liest, der kann sich über eine immerhin kleine Auswahl freuen. Ralph beantwortet im ZF-Forum sogar Fragen zu seinem Buch, Daumen hoch dafür! Aber auch wer sich sein Buch nicht kaufen will, findet im Forum trotzdem Tipps, Tricks und Hilfen.

Wer sich lieber auf Englisch austauschen will, dem seien die Mailing list und die IRC Channels ans Herz gelegt. Zu guter Letzt gibt es natürlich auch noch den Quellcode selbst und hunderte (?) frei zugängliche Module, in denen man nachforschen und nach best practices suchen kann.

Die gesuchten Informationen zu finden ist vielleicht nicht mehr so einfach wie beim ZF1, aber sie sind vorhanden. Also sucht euch eure ZF2-Kanäle zusammen und dann ran an die Tastatur 😉