A Dependency Injection Container that fits in a tweet
Twittee is the smallest, and still useful, Dependency Injection Container
in PHP; it is also probably one of the first public software to use the newest
anonymous functions support of PHP 5.3.
Packed in less than 140 characters, it fits in a tweet.
Despite its size, Twittee is a full-featured Dependency Injection Container
with support for object definitions, object injection and parameters.
Published in 2009 by Fabien Potencier, Twittee is in the Public Domain.
Tweet me if you find a bug!
Finding a simple example to demonstrate a Dependency Injection Container is
not an easy task. Instead of showing a classic “Hello World!” example, which
would have been too simple to demonstrate the power of Twittee, I have
converted the example I used to introduce the Symfony 2 Dependency Injection
Container on my blog.
The following example shows how to create a Zend_Mail object that sends its
emails using a Gmail account:
$c = new Container();
// parameters
$c->mailer_class = function () { return 'Zend_Mail'; };
$c->mailer_username = function () { return 'fabien'; };
$c->mailer_password = function () { return 'myPass'; };
// objects / services
$c->mailer_transport = function ($c) {
return new Zend_Mail_Transport_Smtp(
'smtp.gmail.com',
array(
'auth' => 'login',
'username' => $c->mailer_username,
'password' => $c->mailer_password,
'ssl' => 'ssl',
'port' => 465,
)
);
};
$c->mailer = function ($c) {
$obj = new $c->mailer_class();
$obj->setDefaultTransport($c->mailer_transport);
return $obj;
};
// get the mailer
$mailer = $c->mailer;
Some explanations about the code are in order:
Parameters are defined by anonymous functions that return strings;
Objects/services are defined by anonymous functions that return object
instances;
Links between objects and parameters access are done by accessing the
container, which is passed to the anonymous function as an argument.
Try the Symfony Service Container.
If you like Twittee, you will also probably like Twitto, the Web Framework
that fits in a tweet!