Version 3 is the first new major release of zend-di, and contains a number of backward incompatible changes. These were introduced to provide better performance, stability, and predictability.
This guide describes how to migrate from Version 2 to 3.
What has changed?
This lists the most impacting changes and potential pitfalls when
zend-di version 3.
The injector now only supports constructor injections. If you require injections based on "Aware" interfaces or setter/method injections, you need to provide these on your own. You could do this by decorating the injector instance or using initializers in zend-servicemanager.
\Zend\Di\Diis renamed to
\Zend\Di\InjectorInterface. It also is no longer an IoC container which offers
has(). Container functionality is now provided via
Zend\Di\DefaultContainer, which implements
Psr\Container\ContainerInterface. If you were using
\Zend\Di\Dias an IoC container, please switch to
Zend\Di\DefaultContaineror use it with zend-servicemanager.
All programmatic and array-based definitions were dropped. If you need custom definitions, implement
The definition compiler was removed in favor of a code generator, which offers better performance.
Added PHP 7.1 type safety. All interfaces and classes are strongly typed, and all methods use return typehints, as well as scalar typehints where needed.
Zend\Di\ServiceLocatorwere removed in favor of the code generator, which creates zend-servicemanager compatible factories.
Migrating from v2 to v3 with zend-mvc
When you are using zend-mvc, you can follow these steps to upgrade:
composer.json, or execute
composer remove zendframework/zend-servicemanager-di.
- Change the version constraint for
^3.0, or execute
composer require "zendframework/zend-di:^3.0".
- Change any remaining module entries for
- If you are using any factories from zend-servicemanager-di, you may have to
replace them with
- Migrate your zend-di config to the new configuration format.
zend-di configuration is now expected in
$config is your
The zend-di config service factory will automatically attempt to migrate legacy
configurations at runtime, which gives you some time to migrate your configs.
You can use
Zend\Di\LegacyConfig to help migrating existing configs:
use Zend\Di\LegacyConfig; $migrated = new LegacyConfig($diConfigArray); $code = var_export($migrated->toArray(), true);
When the zend-di config service factory is used to create configuration for use
DefaultContainer, if it detects the
$config['di] key, it will emit an
E_USER_DEPRECATED error, pointing to this
documentation. We recommend using the above approach to convert your
configuration to the format recognized by version 3.