Simple inversion of control container

1.1.0 2014-01-22 23:25 UTC

This package is not auto-updated.

Last update: 2022-08-01 19:16:03 UTC


Build Status

A simple inversion-of-control container.


Install using composer:

  "require": {
    "tmont/blueshift": "1.1.*"

Blue Shift is PSR-4 compliant, so the following will setup autoloading once you've composer install'd:

require_once 'vendor/autoload.php';


Some example objects:

interface MyInterface {}

class MyType implements MyInterface {
  public function __construct(MyOtherType $type) {
    $this->type = $type;

class MyOtherType {
  public function __construct($foo) {
    $this->foo = $foo;

Registering a type and an instance:

$container = new Tmont\BlueShift\Container();
  ->registerType('MyType', 'MyType')
  ->registerInstance('MyOtherType', new MyOtherType('bar'));

$myType = $container->resolve('MyType');
echo $myType->type->foo; // 'bar'

Registering a mapped type (interface -> implementation):

$container = new Tmont\BlueShift\Container();
  ->registerType('MyInterface', 'MyType')
  ->registerInstance('MyOtherType', new MyOtherType('bar'));

$myType = $container->resolve('MyInterface');
echo $myType instanceof MyInterface; // true
echo $myType instanceof MyClass; // true

Proxies and interception using Phroxy:

use Tmont\Phroxy\Interceptor;
use Tmont\Phroxy\InterceptionContext;

class MyInterceptableClass {
	public function foo() {
		return 'intercepted!';

class MyInterceptor implements Interceptor {
	public function onBeforeMethodCall(InterceptionContext $context) {
		$context->setReturnValue('not foo');

	public function onAfterMethodCall(InterceptionContext $context) {}

$container = new Tmont\BlueShift\Container();
  ->registerType('MyInterceptableClass', 'MyInterceptableClass')
  ->registerInterceptor(new MyInterceptor(), function(ReflectionMethod $method) {
	    return $method->getDeclaringClass()->getName() === 'MyInterceptableClass' &&
	        $method->getName() === 'foo';

$obj = $container->resolve('MyInterceptableClass');
echo $obj->foo(); // 'intercepted!'

The container can also resolve anything you give it, even if you don't explicitly create a mapping, provided the type is instantiable.

class Nope {
	private function __construct() {}

class Yup {}

$container = new Tmont\BlueShift\Container();
$container->resolve('Yup'); //no probalo
$container->resolve('Nope'); //throws InvalidConstructorException


git clone
cd blueshift
composer install