I have a new module for which I’m writing tests.
The module contains a class which implements ServiceLocatorAwareInterface because it needs to create other objects using the DI container. Everything works fine when running in the skeleton app, but when running module tests i get the following:
Zend\Di\Exception\RuntimeException: Invalid instantiator of type “NULL” for “Zend\ServiceManager\ServiceLocatorInterface”
Researching a little bit I find that the DI container tries to create a new object of type “ServiceLocatorAwareInterface”, which is of course wrong.
Digging a little more in the tests bootstrap, I find that adding the following line solves the problem, as in the DI now knows what class to instantiate for that interface.
$di->instanceManager()->addTypePreference('Zend\ServiceManager\ServiceLocatorInterface', new \Zend\ServiceManager\ServiceManager());
I’m not sure whether this is the best solution to the problem, as the ServiceManager passed by me is a dummy one.
Does anyone have any other ideas?
Yes, you are going in the right direction. (See the preferences documentation)
Not many people are using DI these days in favor of the ServiceManager (myself included), but if the config for DI remains similar to how it was during the ZF2 betas, you should be able to add a “preferences” section to your DI config like so:
This configuration block can replace your call to
$di->instanceManager()->addTypePreference()Looking through the current docs, and mimicking the example here, you may have success defining the DI config as shown below using the ZF2 official release: