ZF2: Initializer

Heute geht es darum wie man automatisiert Daten in Klassen mit dem ZF2 injizieren kann.

Angenommen wir wollen in unseren Services automatisch den Namen des Benutzers haben und wir wollen diesen nicht jedesmal manuell übergben müssen.

Als erstes erstellen wir uns ein Interface was unsere Methode zum setzen des Namens definiert

interface UserAwareInterface
{
    public function setUser($user);
}

Natürlich brauchen wir jetzt auch noch eine Klasse die für uns dieses setzen übernimmt.

class UserInitializer
{
    public function initialize($instance, ServiceLocatorInterface $serviceLocator)
    {
        if ($instance instanceof UserAwareInterface) {
            $instance->setUser('Test User');
        }
    }
}

Jetzt müssen wir nur noch dafür sorgen, dass das ZF2 weiß das beim Aufruf unseres Services der User initialisiert werden soll. Dazu schreiben wir in unsere Service-Config folgende Zeilen.

return array(
 
    ...
 
    'initializers' => array(
        'UserInitializer'
    ),
 
    ...
);

Wenn wir jetzt in unseren Service das Interface implementieren haben wir es auch schon geschafft.

class TestService implements UserAwareInterface
{
    protected $user;
 
    public function setUser($user)
    {
        $this->user = $user;
    }
}

Wenn wir uns jetzt über den ZF2 ServiceLocator unseren Service holen, wir automatisch der Initializer aufgerufen. Dieser prüft ob der Service unser Interface implementiert und wenn dies der Fall ist wird der Name gesetzt.

Nachteil an dieser Vorgehensweise ist natürlich, dass bei jedem holen eines Services über den ServiceLocator diese Prüfung ausgeführt wird.

Kommentar verfassen