codeburner / container
The faster IoC Container ever seen.
Installs: 31
Dependents: 0
Suggesters: 0
Security: 0
Stars: 4
Watchers: 1
Forks: 1
Open Issues: 0
pkg:composer/codeburner/container
Requires
- php: >=7.0.0
- psr/container: 1.0.x-dev
Requires (Dev)
- phpunit/phpunit: ~4.0
This package is not auto-updated.
Last update: 2025-10-25 22:55:42 UTC
README
The faster IoC container package for you build blazing fast applications for the web.
Thanks to Tom Butler for motivate me with this announce of dice, a fast dependency injection container.
##Instalation
Add codeburner/container to your composer.json file, and update or install composer dependencies.
{
"require": {
"codeburner/container": "^2.0"
}
}
or via CLI:
$ composer require codeburner/container --save
##Usage
Introduction
Welcome to the Codeburner blazing fast container docs! Before starting the usage is recommended understand the main goal and mission of all parts of this package.
Performance
Codeburner project create packages with performance in focus, and the benchmarks are comming!
Concepts
The container is responsable to automatilly instantiate new objects, resolving all class dependencies and storing these objects over aliases. This enable a greater flexibility removing hard-coded class dependencies, and instead, making the dependencies be dinacally injected at run-time.
Usage
After you have the classes ready to be instantiate, you only need to register the bindings and call then.
use Codeburner\Container\Container; $container = new Container; // Regiser a "stdClass" class to a "std" key. $container->set('std', 'stdClass'); // Accessing new "stdClass" objects. $container->get('std');
Examples
Usage examples are comming soon.
Bindings
Bindings are the objects stored in the container. The container implements the PSR-11 providing the get($id) and has($id) methods to access the bindings, and define the set($id, $concrete) to store objects.
class ClassA { public function __construct(stdClass $dependency) { } } $container->set('my-a', 'ClassA'); if ($container->has('my-a')) { $container->get('my-a'); }
Binding Types
Resolvable Bindings
Resolvable bindings will return a new instance in every access.
$container->set('app.model.posts', App\Model\Post::class); $obj1 = $container->get('app.model.posts'); // App\Model\Post#1 $obj2 = $container->get('app.model.posts'); // App\Model\Post#2
Resolved Bindings
Resolved bindings are no more than singletons, every access will return the same instance.
// you can define by passing a third parameter to set $container->set('database', App\Database::class, true); // or using the `singleton` method $container->singleton('database', App\Database::class); $obj1 = $container->get('database'); // App\Database#1 $obj2 = $container->get('database'); // App\Database#1
Binding Ways
Strings
The simplest way to define a binding, you only need to give a class name as string.
class ClassNameTest { } $container->set('someobj', ClassNameTest::class);
Closures
Some times you need to set some attributes or make some initial logic on objects, you can do it with a closure binding.
$container->set('someobj', function ($container) { $obj = new stdClass; $obj->attribute = 1; return $obj; });
Instances
If you need to attach an existent instance, you should use the set or instance method.
$obj = new stdClass; // you can set instances directly by the set method $container->set('std', $obj); // or use the `instance` method $container->instance('std', $obj);
Resolving Bindings
The great goal of the container is to automatically inject all class dependencies, if you only need to create an instance of a class without binding then into container use the make method.
class Post { public function __construct(Category $category) { $this->category = $category; } } class Category { public function __construct() { $this->id = rand(); } } $post = $container->make(Post::class); echo $post->category->id;
Setting Dependencies Manually
Sometimes you want to define that some class will receive a specific object of another class on instantiation.
class Post { public function __construct(Category $category) { $this->category = $category; } } class Category { public function __construct() { $this->id = rand(); } } $category = new Category; $category->id = 1; $container->setTo(Post::class, Category::class, $category); $post = $container->make(Post::class); echo $post->category->id; // 1
make($abstract, $parameters = [], $force = false) accepts a second parameter to defined resolved dependencies, and a third to ensure that a new object will be created.
$post = $container->make(Post::class, [Category::class => new Category], true);
Executing Closures
If you have a closure with dependencies you can use the call($closure, $parameters = []) method to resolve then.
$container->call(function (User $user, Posts $posts) { // ... });
And as well as make, you can pass an array of resolved dependencies.
$container->call(function (User $user, Posts $posts) {}, [User::class => new User]);
Extending Bindings
Some times you need to modify a binding, to do that use the extend method. They receive the old binding object and a container reference.
$container->set('app.services.mail', App\Services\MailService::class); $container->extend('app.services.mail', function ($instance, $container) { $instance->environment('development'); $instance->setHtmlWrapper($container->get('app.wrappers.html')); return $instance; });
Exceptions
The Codeburner Container implements PSR-11 providing two types of exceptions, the Psr\Container\Exception\NotFoundException and Psr\Container\Exception\ContainerException.
API
- Container
call(closure $closure, array $parameters = []) : mixedExecute a closure resolving its dependenciesmake(string $abstract, array $parameters = [], bool $force = false) : mixedResolve something in the containerflush() : ContainerRenew the containerget(string $abstract) : mixedGet something stored in the containerhas(string $abstract) : boolVerify if something is stored in the containerset(string $abstract, $concrete, bool $shared = false) : ContainerStore something in the containersetIf(string $abstract, $concrete, bool $shared = false) : ContainerStore something in the container if it does not already existssetTo(string $abstract, string $dependencyName, $dependency) : ContainerDefine a resolved dependency to something in the containersingleton(string $abstract, $concrete) : ContainerStore a new singleton objectinstance(string $abstract, $concrete) : ContainerStore a new instantiated classisSingleton(string $abstract) : boolVerify if something in the container is a singletonisInstance(string $abstract) : boolVerify if something in the container is a instanceextend(string $abstract, closure $extender) : ContainerWrap something instantiationshare(string $abstract) : ContainerConvert something to a singleton