Migration Guide
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
upgrading to 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\Di
is renamed to\Zend\Di\InjectorInterface
. It also is no longer an IoC container which offersget()
/has()
. Container functionality is now provided viaZend\Di\DefaultContainer
, which implementsPsr\Container\ContainerInterface
. If you were using\Zend\Di\Di
as an IoC container, please switch toZend\Di\DefaultContainer
or use it with zend-servicemanager. -
All programmatic and array-based definitions were dropped. If you need custom definitions, implement
\Zend\Di\Definition\DefinitionInterface
. -
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.
-
Generator
andGeneratorInstance
inZend\Di\ServiceLocator
were 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:
- Remove
zendframework/zend-servicemanager-di
from yourcomposer.json
, or executecomposer remove zendframework/zend-servicemanager-di
. - Change the version constraint for
zendframework/zend-di
to^3.0
, or executecomposer require "zendframework/zend-di:^3.0"
. - Change any remaining module entries for
Zend\ServiceManager\Di\Module
toZend\Di\Module
within eitherconfig/application.config.php
orconfig/modules.config.php
. - If you are using any factories from zend-servicemanager-di, you may have to
replace them with
Zend\Di\Container\AutowireFactory
. - Migrate your zend-di config to the new configuration format.
Migrating configuration
zend-di configuration is now expected in $config['dependencies']['auto']
,
where $config
is your config
service.
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
with the AutowireFactory
and/or 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.
Found a mistake or want to contribute to the documentation? Edit this page on GitHub!