Slipstream automates dependency injection allowing you to add or remove dependencies in real time without modifying any other classes. Dependencies are typically injected through the __construct method of a class using type hinting. Alternatively, they can be injected through an inject() method.
Install the latest version with
$ composer require ooblatron/slipstream -o
Please note the -o
flag. This generates the Composer autoload class map that is required by Slipstream.
<?php
use Slipstream\SlipstreamFactory;
$vendorPath = '../vendor/'; // Change this to the location of your Composer vendor directory
$classLoader = require $vendorPath.'autoload.php';
$factory = new SlipstreamFactory($classLoader);
$newObject = $factory->get('newObject');
Objects are created with all dependencies automatically injected, without you having to supply them or update Pimple registration details.
<?php
class NewObject
{
private Dependency1 $dependency1;
private Dependency2 $dependency2;
public function __construct(
Dependency1 $dependency1,
Dependency2 $dependency2
): {
$this->dependency1 = $dependency1;
$this->dependency2 = $dependency2;
}
public function someMethod() {
$this->dependency1->doSomething();
}
}
<?php
class NewObject
{
public function __construct(
private Dependency1 $dependency1,
private Dependency2 $dependency2
): { }
public function someMethod() {
$this->dependency1->doSomething();
}
}
This is useful for third party classes (e.g. Laravel models) whose dependencies cannot be injected through the __construct() method). This example depends on your Factory having been created already (see above).
<?php
class ExistingObject
{
public function inject(
private Dependency1 $dependency1,
private Dependency2 $dependency2
): { }
public function someMethod() {
$this->dependency1->doSomething();
}
}
<?php
use Slipstream\Slipstream;
class ClassUsingExistingObject
{
public function __construct(
Slipstream $slipstream,
ExistingObject $existingObject
) {
$this->slipstream = $slipstream;
$this->existingObject = $existingObject;
}
public function methodThatUsesExistingObject() {
// Inject dependencies into ExistingObject
$this->slipstream->inject($this->existingObject);
}
}
Slipstream relies on the Composer autoload class map to identify dependencies. Therefore, the following command must be run whenever you create or rename a class or change the namespace of a class.
composer dump-autoload -o
PHP Reflection is used in conjunction with the Composer autoloader map to identify classes that are dependencies for the class being instantiated. These are iteratively instantiated and injected into the new object.
Tim Rogers - tim@ooblatron.org - https://twitter.com/timdrogers
Slipstream is licensed under the MIT License - see the LICENSE file for details
This library was inspired by the way that Laravel automatically injects dependencies into controller methods.
This library uses the Pimple dependency manager to hold instantiated classes for reuse and injection.