All Projects → thephpleague → Di

thephpleague / Di

Licence: mit
An Ultra-Fast Dependency Injection Container. DEPRECATED

League\Di

Build Status Dependencies Status Coverage Status Total Downloads Latest Stable Version

DEPRECATED: Use Orno\Di instead as the two are incredibly similar, and theirs is more actively developed.

The League\Di library provides a fast and powerful Dependency Injection Container for your application.

Install

Via Composer

{
    "require": {
        "league/di": ">=1.1"
    }
}

Usage

Get a Container Object

include 'vendor/autoload.php';

$container = new League\Di\Container;

Bind a concrete class to an interface

$container->bind('\Foo\Bar\BazInterface', '\Foo\Bar\Baz');

Automatic Dependency Resolution

The Di Container is able to recursively resolve objects and their dependencies by inspecting the type hints on an object's constructor.

namespace Foo\Bar;

class Baz
{
  public function __construct(Qux $qux, Corge $corge)
  {
    $this->qux = $qux;
    $this->corge = $corge;
  }

  public function setQuux(Quux $quux)
  {
    $this->quux = $quux;
  }
}

$container->resolve('\Foo\Bar\Baz');

Defining Arguments

Alternatively, you can specify what to inject into the class upon instantiation.

Define Constructor Args

$container->bind('\Foo\Bar\Baz')->addArgs(array('\Foo\Bar\Quux', '\Foo\Bar\Corge'));

$container->resolve('\Foo\Bar\Baz');

Define Methods to Call with Args

$container->bind('\Foo\Bar\Baz')->withMethod('setQuux', array('\Foo\Bar\Quux'));

$container->resolve('\Foo\Bar\Baz');

Child Containers and Scope Resolution

A great feature of League\Di is it's ability to provide child containers with a separate resolution scope to that of it's parent container. If you bind a concrete class to an interface within one container, you can re-bind it in the child container, without fear of overwriting the original binding in the parent container.

Creating a Child Container

There are two ways to create a child container.

$child = $continer->createChild();

// OR

$child = new Container($container);

Using a Child Container

The primary benefit of using child containers is scope-specific resolution.

$container->bind('FooInterface', 'Foo');

// Assuming class Bar has a FooInterface dependency.
// This would use the Foo implementation.
$bar = $container->resolve('Bar');

// ...
$child = $container->createChild();
$child->bind('FooInterface', 'Baz');

// And this would use the Baz implementation.
$bar = $child->resolve('Bar');

TODO

  • Extensive Documentation

Contributing

Please see CONTRIBUTING for details.

Credits

License

The MIT License (MIT). Please see License File for more information.

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].