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', ]);
$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
newInstance(), so make sure everything is lazy-loaded, or else you will run into something like cannot modify container when locked.
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
An instance factory creates multiple instances of the same class; refer the docs for more information.