14 KiB
Change log
5.0
Improvements:
-
Lighter package: requires 4 less Composer dependencies by default
-
#207: Support for
DI\link()in arrays -
#208: Support for nested definitions
-
#226:
DI\factory()can now be omitted with closures:// before 'My\Class' => DI\factory(function () { return new Foo(); }) // now (optional shortcut) 'My\Class' => function () { return new Foo(); } -
#235
DI\link()is now deprecated in favor ofDI\get(). There is no BC break asDI\link()still works. -
#193
DI\object()->method()now supports calling the same method twice (or more). -
#248: New
DI\decorate()function to decorate a previously defined entry:// file A.php ProductDaoInterface::class => DI\get(ProductDaoDatabase::class) // file B.php ProductDaoInterface::class => DI\decorate(function ($previous, ContainerInterface $c) { return new ProductDaoCached($previous, $c->get('cache.backend')); })
BC breaks:
- #251 Annotations are disabled by default, if you use annotations enable them with
$containerBuilder->useAnnotations(true). - #198
ocramius/proxy-manageris not installed by default anymore, you need to require it incomposer.jsonif you want to use lazy injection - Closures are now converted into factory definitions automatically. If you ever defined a closure as a value (e.g. to have the closure injected in a class), you need to wrap the closure with the new
DI\value()helper. - #223
DI\ContainerInterfacewas deprecated since v4.1 and has been removed
Internal changes in case you were replacing/extending some parts:
- the definition sources architecture has been refactored, if you defined custom definition sources you will need to update your code (it should be much easier now)
DI\Scopeinternal implementation has changed. You are encouraged to use the constants (DI\Scope::SINGLETONandDI\Scope::PROTOTYPE) instead of the static methods, but backward compatibility is kept (static methods still work).Container::call()now uses the Invoker external library
4.4
Read the news entry.
- #185 Support for invokable objects in
Container::call() - #192 Support for invokable classes in
Container::call()(will instantiate the class) - #184 Option to ignore phpdoc errors
4.3
Read the news entry.
- #176 New definition type for reading environment variables:
DI\env() - #181
DI\FactoryInterfaceandDI\InvokerInterfaceare now auto-registered inside the container so that you can inject them without any configuration needed - #173
$container->call(['MyClass', 'method]);will getMyClassfrom the container ifmethod()is not a static method
4.2.2
- Fixed #180:
Container::call()with object methods ([$object, 'method']) is now supported
4.2.1
- Support for PHP 5.3.3, which was previously incomplete because of a bug in the reflection (there is now a workaround for this bug)
But if you can, seriously avoid this (really old) PHP version and upgrade.
4.2
Read the news entry.
Minor BC-break: Optional parameters (that were not configured) were injected, they are now ignored, which is what naturally makes sense since they are optional. Example:
public function __construct(Bar $bar = null)
{
$this->bar = $bar ?: $this->createDefaultBar();
}
Before 4.2, PHP-DI would try to inject a Bar instance. From 4.2 and onwards, it will inject null.
Of course, you can still explicitly define an injection for the optional parameters and that will work.
All changes:
- #162 Added
Container::call()to call functions with dependency injection - #156 Wildcards (
*) in definitions - #164 Prototype scope is now available for
factory()definitions too - FIXED #168
Container::has()now returns false for interfaces and abstract classes that are not mapped in the definitions - FIXED #171 Optional parameters are now ignored (not injected) if not set in the definitions (see the BC-break warning above)
4.1
Read the news entry.
BC-breaks: None.
- #138 Container-interop compliance
- #143 Much more explicit exception messages
- #157 HHVM support
- #158 Improved the documentation for Symfony 2 integration
4.0
Major changes:
- The configuration format has changed (read more here to understand why)
Read the migration guide if you are using 3.x: Migration guide from 3.x to 4.0.
BC-breaks:
- YAML, XML and JSON definitions have been removed, and the PHP definition format has changed (see above)
ContainerSingletonhas been removed- You cannot configure an injection as lazy anymore, you can only configure a container entry as lazy
- The Container constructor now takes mandatory parameters. Use the ContainerBuilder to create a Container.
- Removed
ContainerBuilder::setDefinitionsValidation()(no definition validation anymore) ContainerBuilder::useReflection()is now named:ContainerBuilder::useAutowiring()ContainerBuilder::addDefinitionsFromFile()is now named:ContainerBuilder::addDefinitions()- The
$proxyparameter inContainer::get($name, $proxy = true)hase been removed. To get a proxy, you now need to define an entry as "lazy".
Other changes:
- Added
ContainerInterfaceandFactoryInterface, both implemented by the container. - #115 Added
Container::has() - #142 Added
Container::make()to resolve an entry - #127 Added support for cases where PHP-DI is wrapped by another container (like Acclimate): PHP-DI can now use the wrapping container to perform injections
- #128 Configure entry aliases
- #110 XML definitions are not supported anymore
- #122 JSON definitions are not supported anymore
ContainerSingletonhas finally been removed- Added
ContainerBuilder::buildDevContainer()to get started with a default container very easily. - #99 Fixed "
@paramwith PHP internal type throws exception"
3.5.1
- FIXED #126:
Container::setwithout effect if a value has already been set and retrieved
3.5
Read the news entry.
- Importing
@Injectand@Injectableannotations is now optional! It means that you don't have to writeuse DI\Annotation\Injectanymore - FIXED #124:
@Injectsannotation conflicts with other annotations
3.4
Read the news entry.
- #106 You can now define arrays of values (in YAML, PHP, …) thanks to @unkind
- #98
ContainerBuilderis now fluent thanks to @drdamour - #101 Optional parameters are now supported: if you don't define a value to inject, their default value will be used
- XML definitions have been deprecated, there weren't even documented and were not maintained. They will be removed in 4.0.
- FIXED #100: bug for lazy injection in constructors
3.3
Read the news entry.
- Inject dependencies on an existing instance with
Container::injectOn(work from Jeff Flitton: #89). - #86: Optimized definition lookup (faster)
- FIXED #87: Rare bug in the
PhpDocParser, fixed by drdamour
3.2
Read the news entry.
Small BC-break: PHP-DI 3.0 and 3.1 injected properties before calling the constructor. This was confusing and not supported for internal classes. From 3.2 and on, properties are injected after calling the constructor.
- Lazy injection: it is now possible to use lazy injection on properties and methods (setters and constructors).
- Lazy dependencies are now proxies that extend the class they proxy, so type-hinting works.
- Addition of the
ContainerBuilderobject, that helps to create and configure aContainer. - Some methods for configuring the Container have gone deprecated in favor of the
ContainerBuilder. Fear not, these deprecated methods will remain until next major version (4.0).Container::useReflection, use ContainerBuilder::useReflection insteadContainer::useAnnotations, use ContainerBuilder::useAnnotations insteadContainer::setDefinitionCache, use ContainerBuilder::setDefinitionCache insteadContainer::setDefinitionsValidation, use ContainerBuilder::setDefinitionsValidation instead
- The container is now auto-registered (as 'DI\Container'). You can now inject the container without registering it.
3.1.1
- Value definitions (
$container->set('foo', 80)) are not cached anymore - FIXED #82: Serialization error when using a cache
3.1
Read the news entry.
- Zend Framework 1 integration through the PHP-DI-ZF1 project
- Fixed the order of priorities when you mix different definition sources (reflection, annotations, files, …). See Definition overriding
- Now possible to define null values with
$container->set('foo', null)(see #79). - Deprecated usage of
ContainerSingleton, will be removed in next major version (4.0)
3.0.6
- FIXED #76: Definition conflict when setting a closure for a class name
3.0.5
- FIXED #70: Definition conflict when setting a value for a class name
3.0.4
- FIXED #69: YamlDefinitionFileLoader crashes if YAML file is empty
3.0.3
- Fixed over-restrictive dependencies in composer.json
3.0.2
- #64: Non PHP-DI exceptions are not captured-rethrown anymore when injecting dependencies (cleaner stack trace)
3.0.1
- #62: When using aliases, definitions are now merged
3.0
Major compatibility breaks with 2.x.
- The container is no longer a Singleton (but
ContainerSingleton::getInstance()is available for fools who like it) - Setter injection
- Constructor injection
- Scopes: singleton (share the same instance of the class) or prototype (create a new instance each time it is fetched). Defined at class level.
- Configuration is reworked from scratch. Now every configuration backend can do 100% of the job.
- Provided configuration backends:
- Reflection
- Annotations: @Inject, @Injectable
- PHP code (
Container::set()) - PHP array
- YAML file
- As a consequence, annotations are not mandatory anymore, all functionalities can be used with or without annotations.
- Renamed
DI\Annotations\toDI\Annotation\ Containerno longer implements ArrayAccess, use only$container->get($key)now- ZF1 integration broken and removed (work in progress for next releases)
- Code now follows PSR1 and PSR2 coding styles
- FIXED: #58 Getting a proxy of an alias didn't work
2.1
usestatements to import classes from other namespaces are now taken into account with the@varannotation- Updated and lightened the dependencies :
doctrine/commonhas been replaced with more specificdoctrine/annotationsanddoctrine/cache
2.0
Major compatibility breaks with 1.x.
Container::resolveDependencies()has been renamed toContainer::injectAll()- Dependencies are now injected before the constructor is called, and thus are available in the constructor
- Merged
@Valueannotation with@Inject: no difference between value and bean injection anymore - Container implements ArrayAccess for get() and set() (
$container['db.host'] = 'localhost';) - Ini configuration files removed: configuration is done in PHP
- Allow to define beans within closures for lazy-loading
- Switched to MIT License
Warning:
- If you use PHP 5.3 and __wakeup() methods, they will be called when PHP-DI creates new instances of those classes.
1.1
- Caching of annotations based on Doctrine caches
1.0
- DependencyManager renamed to Container
- Refactored basic Container usage with
getandset - Allow named injection
@Inject(name="") - Zend Framework integration