1. Go to this page and download the library: Download lucatume/di52 library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
lucatume / di52 example snippets
/**
* The application bootstrap file: here the container is provided the minimal set of instructions
* R__ . '/vendor/autoload.php';
// Start by building an instance of the DI container.
$container = new Container();
// When an instance of `TemplateInterface` is class needs an instance of the `RepositoryInterface`, then
// return an instance of the `PostsRepository` class.
$container->bind(RepositoryInterface::class, PostsRepository::class);
// But the Users page should use the Users repository.
$container->when(UsersPageRequest::class)
->needs(RepositoryInterface::class)
->give(UsersRepository::class);
// Bind primitive values, e.g. public function __construct( int $per_page ) {}
$container->when(UsersPageRequest::class)
->needs('$per_page')
->give(10);
// Fetch the above class without any further definitions
$container->get(UsersPageRequest::class)
// The `UsersRepository` will
class A {
private $b;
private $c;
public function __construct(B $b, C $c){
$this->b = $b;
$this->c = $c;
}
}
$a = new A(new B(), new C());
class ExtendedB extends B {}
class ExtendedC extends C {}
$a = new a(new ExtendedB(), new ExtendedC());
class A {
private $b;
private $c;
public function __construct(BInterface $b, CInterface $c){
$this->b = $b;
$this->c = $c;
}
}
class B implements BInterface {}
class C implements CInterface {}
$a = new a(new B(), new C());
// before
$a = new A(new B(), new C());
//after
$a = new A(new BetterB(), new C());
class D implements DInterface{
public function __construct(AInterface $a, CInterface $c){}
}
class E {
public function __construct(DInterface $d){}
}
$a = new A (new BetterB(), new C());
$d = new D($a, $c);
$e = new E($d);
$database = $serviceLocator->get('database');
use lucatume\DI52\Container;
use lucatume\DI52\App;
// This is a DI Container.
$diContainer = new Container();
// If we make it globally-available, then it will be used by the Service Locator (the `App` class).
App::setContainer($diContainer);
// Register a binding in the DI Container.
$diContainer->singleton('database', MySqlDb::class);
// We can now globally, i.e. anywhere in the code, access the `db` service.
$db = App::get('database');
use lucatume\DI52\App;
// Register a binding in the App (Service Locator).
App::singleton('database', MySqlDb::class);
// We can now globally, i.e. anywhere in the code, access the `db` service.
$db = App::get('database');
// file ClassThree.php
class ClassThree {
private $one;
private $two;
public function __construct(ClassOne $one, ClassTwo $two){
$this->one = $one;
$this->two = $two;
}
}
// The application bootstrap file
use lucatume\DI52\Container;
$container = new Container();
$three = $container->get('ClassThree');
use lucatume\DI52\Container;
$container = new Container();
$container->setVar('number', 23);
$number = $container->getVar('number');
use lucatume\DI52\Container;
$container = new Container();
// Bind to a class name.
$container->bind(AInterface::class, A::class);
// Bind to a Closure.
$container->bind(BInterface::class, function(){
return new BetterB();
});
// Bind to a constructor and methods that should be called on the built object.
$container->bind(CInterface::class, LegacyC::class, ['init','register']);
// Bind to a factory method.
$container->bind(D::interface, [DFactory::class,'buildInstance'])
// Bind to an object, it will be a singleton by default.
$container->bind(E::interface, new EImplementation());
$e = $container->get(F::class);
use lucatume\DI52\Container;
$container = new Container();
$container->singleton(DBDriverInterface::class, MYSqlDriver::class);
$container->singleton(RepositoryInterface::class, MYSQLRepository::class);
$container->get(RepositoryInterface::class);
use lucatume\DI52\Container;
$container = new Container();
// Storing vars using the ArrayAccess API.
$container['db.name'] = 'appDb';
$container['db.user'] = 'root';
$container['db.pass'] = 'secret';
$container['db.host'] = 'localhost:3306';
// Bindings can be set using ArrayAccess methods.
$container['db.driver'] = MYSQLDriver::class;
// Bound closures will receive the container instance as argument.
$container['db.connection'] = function($container){
$host = $container['db.host']
$user = $container['db.user'],
$pass = $container['db.pass'],
$name = $container['db.name'],
$dbDriver = $container['db.driver'];
$dbDriver->connect($host, $user, $pass, $name);
return new DBConnection($dbDriver);
};
// Equivalent to $container->get('db.connection');
$dbConnection = $container['db.connection'];
// Using ArrayAccess API to store a closure as a variable.
$container['uniqid'] = $container->protect(function(){
return uniqid('id', true);
});
use lucatume\DI52\Container;
$container = new Container();
/*
* By default any object requiring an implementation of the `CacheInterface`
* should be given the same instance of `Array Cache`
*/
$container->singleton(CacheInterface::class, ArrayCache::class);
$container->bind(DbCache::class, function($container){
$cache = $container->get(CacheInterface::class);
$dbCache = new DbCache($cache);
return $dbCache;
});
/*
* But when an implementation of the `CacheInterface` is requested by
* `TransactionManager`, then it should be given an instance of `Array Cache`.
*/
$container->when(TransactionManager::class)
->needs(CacheInterface::class)
->give(DbCache::class);
/*
* We can also bind primitives where the container doesn't know how to auto-wire
* them.
*/
$container->when(MysqlOrm:class)
->needs('$dbUrl')
->give('mysql://user:[email protected]:3306/app');
/*
* When primitives are bound to a class the container will correctly resolve them when building the class
* bound to an interface.
*/
$container->bind(ORMInterface::class, MysqlOrm::class);
// The `ORMInterface` will be resolved an instance of the `MysqlOrm` class, with the `$dbUrl` argument set correctly.
$orm = $container->get(ORMInterface::class);
use lucatume\DI52\Container;
$container = new Container();
$container->bind(RepositoryInterface::class, PostRepository::class);
$container->bind(CacheInterface::class, ArrayCache::class);
$container->bind(LoggerInterface::class, FileLogger::class);
// Decorators are built left to right, outer decorators are listed first.
$container->bindDecorators(PostEndpoint::class, [
LoggingEndpoint::class,
CachingEndpoint::class,
BaseEndpoint::class
]);
use lucatume\DI52\Container;
$container = new Container();
$container->bind(RepositoryInterface::class, PostRepository::class);
$container->bind(CacheInterface::class, ArrayCache::class);
$container->bind(LoggerInterface::class, FileLogger::class);
// Decorators are built left to right, outer decorators are listed first.
$container->bindDecorators(PostEndpoint::class, [
LoggingEndpoint::class,
CachingEndpoint::class,
BaseEndpoint::class
], ['register']);
use lucatume\DI52\Container;
$container = new Container();
$container->bind(RepositoryInterface::class, PostRepository::class);
$container->bind(CacheInterface::class, ArrayCache::class);
$container->bind(LoggerInterface::class, FileLogger::class);
// Decorators are built left to right, outer decorators are listed first.
$container->bindDecorators(PostEndpoint::class, [
LoggingEndpoint::class,
CachingEndpoint::class,
BaseEndpoint::class
], ['register'], true);
use lucatume\DI52\Container;
$container = new Container();
$container->bind(UnsupportedEndpoint::class, function($container){
$template = '404';
$message = 'Nope';
$redirectAfter = 3;
$redirectTo = $container->get(HomeEndpoint::class);
return new UnsupportedEndpoint($template, $message, $redirectAfter, $redirectTo);
});
$container->tag([
HomeEndpoint::class,
PostEndpoint::class,
UnsupportedEndpoint::class,
], 'endpoints');
foreach($container->tagged('endpoints') as $endpoint) {
$endpoint->register();
}
use lucatume\DI52\Container;
$container = new Container();
add_filter('some_filter', [$container->get(SomeFilteringClass::class), 'filter']);
use lucatume\DI52\Container;
$container = new Container();
$container->singleton(SomeFilteringClass::class);
add_filter('some_filter', $container->callback(SomeFilteringClass::class, 'filter'));
// Some code later we need to remove the filter: we'll get the same callback.
remove_filter('some_filter', App::callback(SomeFilteringClass::class, 'filter'));
use lucatume\DI52\ServiceProvider;
// file ProviderOne.php
class ProviderOne extends ServiceProvider {
public function register() {
$this->container->bind(InterfaceOne::class, ClassOne::class);
$this->container->bind(InterfaceTwo::class, ClassTwo::class);
$this->container->singleton(InterfaceThree::class, ClassThree::class);
}
}
// Application bootstrap file.
use lucatume\DI52\Container;
$container = new Container();
$container->register(ProviderOne::class);
$container->register(ProviderTwo::class);
$container->register(ProviderThree::class);
$container->register(ProviderFour::class);
// file ProviderOne.php
use lucatume\DI52\ServiceProvider;
class ProviderOne extends ServiceProvider {
public function register() {
$this->container->bind(InterfaceOne::class, ClassOne::class);
$this->container->bind(InterfaceTwo::class, ClassTwo::class);
$this->container->singleton(InterfaceThree::class, ClassThree::class);
}
public function boot() {
if(defined('SOME_CONSTANT')) {
$this->container->bind(InterfaceFour::class, ClassFour::class);
} else {
$this->container->bind(InterfaceFour::class, AnotherClassFour::class);
}
}
}
// Application bootstrap file.
use lucatume\DI52\Container;
$container = new Container();
$container->register(ProviderOne::class);
$container->register(ProviderTwo::class);
$container->register(ProviderThree::class);
// Some code later ...
$container->boot();
// file ProviderOne.php
use lucatume\DI52\ServiceProvider;
class ProviderOne extends ServiceProvider {
public $deferred = true;
public function provides() {
return array(LegacyClassOne::class, LegacyInterfaceTwo::class);
}
public function register() {
}
}
// Application bootstrap file
use lucatume\DI52\Container;
$container = new Container();
// The provider `register` method will not be called immediately...
$container->register(ProviderOne::class);
// ...it will be called here as it provides the binding of `LegacyClassOne`
$legacyOne = $container->get(LegacyClassOne::class);
// Will not be called again here, done already.
$legacyTwo = $container->get(LegacyInterfaceTwo::class);
// file ProviderOne.php
use lucatume\DI52\ServiceProvider;
class ProviderOne extends ServiceProvider {
/**
* @var ConfigHelper
*/
protected $config;
public function __construct(\lucatume\DI52\Container $container, ConfigHelper $config)
{
parent::__construct($container);
$this->config = $config;
}
public function register()
{
$this->container->when(ClassFour::class)
->needs('$value')
->give($this->config->get('value'));
}
}
// Application bootstrap file.
use lucatume\DI52\Container;
$container = new Container();
$container->register(ProviderOne::class);
// file ProviderOne.php
use lucatume\DI52\ServiceProvider;
class ProviderOne extends ServiceProvider {
/**
* @var bool
*/
protected $service_enabled;
public function __construct(\lucatume\DI52\Container $container, $service_enabled)
{
parent::__construct($container);
$this->service_enabled = $service_enabled;
}
public function register()
{
if (!$this->service_enabled) {
return;
}
$this->container->bind(InterfaceOne::class, ClassOne::class);
}
}
// Application bootstrap file.
use lucatume\DI52\Container;
$container = new Container();
$container->when(ProviderOne::class)
->needs('$service_enabled')
->give(true);
$container->register(ProviderOne::class);
use lucatume\DI52\Container;
$container1 = new Container();
$container2 = new Container(true);
// Default resolution of unbound classes is prototype.
assert($container1->get(A::class) !== $container1->get(A::class));
// The second container will resolve unbound classes once, then store them as singletons.
assert($container2->get(A::class) === $container2->get(A::class));
use lucatume\DI52\Container;
$container = new Container();
// The container will throw any exception thrown during a service resolution without any modification.
$container->setExceptionMask(Container::EXCEPTION_MASK_NONE);
// Wrap any exception thrown during a service resolution in a `ContainerException` instance, modify the message.
$container->setExceptionMask(Container::EXCEPTION_MASK_MESSAGE);
// Wrap any exception thrown during a service resolution in a `ContainerException` instance, modify the trace file and line.
$container->setExceptionMask(Container::EXCEPTION_MASK_FILE_LINE);
// You can combine the options, this is the default value.
$container->setExceptionMask(Container::EXCEPTION_MASK_MESSAGE | Container::EXCEPTION_MASK_FILE_LINE);
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.