Simple DI Container with autowiring in a single file with NO dependencies allows you to easily use it in your PHP applications and especially convenient for WordPress plugins and themes.
__constructor
parameters for classes as well as for scalar types that have default values.There are several ways, you can choose what you more prefer:
composer require renakdup/simple-php-dic
./src/Container.php
to your plugin directory or theme.namespace
in the fileRenakdup\SimpleDIC
to <Your_Plugin_Name>\SimpleDIC
use Renakdup\SimpleDIC\Container;
// create container $container = new Container();
// set service $container->set( Paypal::class, function () { return new Paypal(); } );
// get service $paypal = $container->get( Paypal::class );
// use this object $paypal->pay();
SimpleDIC allows to set values for the container for primitive types:
```php
$container->set( 'requests_limit', 100 );
$container->set( 'post_type', 'products' );
$container->set( 'users_ids', [ 1, 2, 3, 4] );
$user_ids = $container->get( 'users_ids', [ 1, 2, 3, 4] );
Method get()
can resolve not set object in the $container
and then save resolved results in the $container
. It means when you run $container->get( $service )
several times you get the same object.
$obj1 = $constructor->get( Paypal::class );
$obj2 = $constructor->get( Paypal::class );
var_dump( $obj1 === $obj2 ) // true
If you want to instantiate service several time use make()
method.
Factory is an anonymous function
that wrap creating an instance.
Allows to configure how an object will be created and allows to use Conainer
instance inside the factory.
$container->set( Paypal::class, function () {
return new Paypal();
} );
As well factories create objects in the Lazy Load mode. It means that object will be created just when you resolve it by using get()
method:
$container->set( Paypal::class, function () {
return new Paypal();
} );
$paypal = $constructor->get( Paypal::class ); // PayPal instance created
SimpleDIC allows to get a Container
instance inside a factory if you add parameter in a callback ( Container $c )
. This allows to get or resolve another services inside for building an object:
$container->set( 'config', [
'currency' => '$',
'environment' => 'production',
] );
$container->set( Paypal::class, function ( Container $c ) {
return new Paypal( $c->get('config') );
} );
SimpleDIŠ” autowiring feature allows to Container
automatically create and inject dependencies.
I'll show an example:
class PayPalSDK {}
class Logger {}
class Paypal {
public function __constructor( PayPalSDK $pal_sdk, Logger $logger ) {
//...
}
}
And then when you create Paypal::class
, you run $container->get(Paypal::class)
, and Container
identifies all classes in the constructor and resolves them. As if it's:
new Paypal( new PayPalSDK(), new Logger() );
Container autowiring can resolve default values for primitive parameters in a constructor:
class Logger {
public function __constructor( $type = 'filestorage', $error_lvl = 1 ) {
//...
}
}
You can use auto-wiring feature that allows to Container
create an instances that requires in the __constructor
of class as well as it resolves constructor dependencies for
[!NOTE] But if object creating is more complex and requires configuring and you don't have parameters with default values in the constructor then you need to use
factory
for preparing service.
Method make()
resolves services by its name. It returns a new instance of service every time and supports auto-wiring.
$conatainer->make( Paypal::class );
[!NOTE]
Constructor's dependencies will not instantiate every time.
If dependencies were resolved before then they will be passed as resolved dependencies.
Consider example:
class PayPalSDK {}
class Paypal {
public PayPalSDK $pal_sdk;
public function __constructor( PayPalSDK $pal_sdk ) {
$this->pal_sdk = $pal_sdk;
}
}
// if we create PayPal instances twice
$paypal1 = $container->make( Paypal::class );
$paypal2 = $container->make( Paypal::class );
var_dump( $paypal1 !== $paypal2 ); // true
var_dump( $paypal1->pal_sdk === $paypal2->pal_sdk ); // true
Dependencies of PayPal service will not be recreated and will be taken from already resolved objects.
in progress
Use ReflectionParameter::getType() and the ReflectionType APIs should be used instead.
for PHP8remove
method.__constructor
.The MIT License (MIT). Please see the License File for more information.