To implement a loosely coupled architecture in order to get better testable, maintainable and extendable code.
Configuration gets injected and Connection
will get all that it
needs from $config
. Without DI, the configuration would be created
directly in Connection
, which is not very good for testing and
extending Connection
.
Notice we are following Inversion of control principle in Connection
by asking $config
to implement Parameters
interface. This
decouples our components. We don't care where the source of information
comes from, we only care that $config
has certain methods to
retrieve that information. Read more about Inversion of control
here.
- The Doctrine2 ORM uses dependency injection e.g. for configuration
that is injected into a
Connection
object. For testing purposes, one can easily create a mock object of the configuration and inject that into theConnection
object - Symfony and Zend Framework 2 already have containers for DI that create objects via a configuration array and inject them where needed (i.e. in Controllers)
You can also find these code on GitHub
AbstractConfig.php
.. literalinclude:: AbstractConfig.php :language: php :linenos:
Parameters.php
.. literalinclude:: Parameters.php :language: php :linenos:
ArrayConfig.php
.. literalinclude:: ArrayConfig.php :language: php :linenos:
Connection.php
.. literalinclude:: Connection.php :language: php :linenos:
Tests/DependencyInjectionTest.php
.. literalinclude:: Tests/DependencyInjectionTest.php :language: php :linenos:
Tests/config.php
.. literalinclude:: Tests/config.php :language: php :linenos: