Aura.Di 3.x is largely similar to 2.x, but there are some backwards-compatibility breaks, as well as some new features.
The way the container is instantiated has been changed from this ...
use Aura\Di\Container;
use Aura\Di\Factory;
use Aura\Di\ContainerBuilder;
$di = new Container(new Factory);
// or
$container_builder = new ContainerBuilder();
$di = $container_builder->newInstance(
array(),
array(),
$auto_resolve = false
);
... to this:
use Aura\Di\ContainerBuilder;
$container_builder = new ContainerBuilder();
// use the builder to create and configure a container
// using an array of ContainerConfig classes
$di = $container_builder->newConfiguredInstance([
'Aura\Cli\_Config\Common',
'Aura\Router\_Config\Common',
'Aura\Web\_Config\Common',
]);
setter
vs setters
Use of $di->setter
in 2.x is now $di->setters
in 3.x. Please note there is an additional s
in the end.
The container now calls lock()
automatically when you call get()
or newInstance()
, so make sure everything is lazy-loaded, or else you will run into something like cannot modify container when locked.
Aura\Di\Config
in 2.x is now Aura\Di\ContainerConfig
in 3.x.
Example taken from Radar:
$di->params['Radar\Adr\Handler\RoutingHandler']['matcher'] = $di->lazyGetCall('radar/adr:router', 'getMatcher');
Here the value assigned to matcher
is taken from the RouterContainer getMatcher()
method.
An instance factory creates multiple instances of the same class; refer the docs for more information.