Was waren nochmal Initializer?
Eigentlich ganz einfach: Alle bei einem ServieManager registrierten Initializer werden nach der Erzeugung eines ebenfalls beim ServiceManagers registrierten Services aufgerufen. Dabei bekommen diese Initializer die jeweilige Instanz des gerade initialisierten Services übergeben. Dies gilt auch für die Controller, welche im ControllerManager registriert sind.

Und so wendet man einen Initializer an, beispielsweise um den EntityMapper aus den vorherigen Beiträgen in den Controller zu injizieren.

Innerhalb der module.config.php Datei, unterhalb des “controllers” Konfiguration-Eintrages, definieren wir folgendes:

'initializers' => array(
       'entityMapper' => function($instance, $serviceManager) {
           if ($instance instanceof EntityMapperAwareInterface) {
               $entityMapper = $serviceManager->getServiceLocator()->get("EntityMapper");
               $instance->setEntityMapper($entityMapper);
           }
       }
)

Zudem benötigen wir ein neues Interface und machen hier von der InterfaceAware Funktionalität des Frameworks gebrauch (dazu wann anders mehr) namens EntityMapperAwareInterface.

In meinem Beispiel habe ich den EntityMapper innerhalb des Application Moduls abgelegt. Daher lege ich das entsprechende Aware Interface an die selbe Stelle (modules\Application\src\Application\Mapper\EntityMapperAwareInterface)

namespace Application\Mapper;

interface EntityMapperAwareInterface {
    function setEntityMapper(EntityMapper $entityMapper);
}

Was passiert nun?
Jedes mal wenn ein Controller über den ServiceManager erzeugt wird, wird dessen Instanz den registrierten Initializern übergeben. Unser EntityMapper Initializer prüft zunächst, ob die Instanz das EntityMapperAwareInterface implementiert. Falls dem so ist, wird über den Service Manager eine EntityMapper Instanz angefordert und dem Controller via ->setEntityMapper() injiziert.
Hinweis: Die angeforderte Instanz EntityMapper ist ein Alias von Application\Mapper\EntityMapper.

Passen wir unseren Controller, welcher den EntityMapper benötigt, nun wie folgt an, so erhalten wir dort eine Instanz des EntityMappers.
Praktisch für jeden Controller der mit Entities arbeiten soll.

class CommissionController extends AbstractActionController implements EntityMapperAwareInterface {
    protected $entityMapper;
    public function setEntityMapper(EntityMapper $entityMapper) {
        $this->entityMapper = $entityMapper;
    }
    [...]

Ob es nun schöner/eleganter ist, die Abhängigkeit zum EntityMapper via Initializer oder ServiceManager aufzulösen, ist sicherlich Geschmacksache und soll hier nur als Beispiel für einen sinnvollen Initializer dienen.

Categories: Zend Framework 2