tmont / blueshift
Simple inversion of control container
1.1.0
2014-01-22 23:25 UTC
Requires
- tmont/phroxy: 1.1.0
Requires (Dev)
- phpunit/phpunit: 3.7.*
This package is not auto-updated.
Last update: 2024-11-19 06:49:14 UTC
README
A simple inversion-of-control container.
Installation
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';
Usage
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(); $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(); $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(); $container ->registerType('MyInterceptableClass', 'MyInterceptableClass') ->proxyType('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
Development
git clone git@github.com:tmont/blueshift.git
cd blueshift
composer install
vendor/bin/phpunit