$container->extend(APIClient::class, function ($client, Container $container) {
return new APIClientDecorator($client);
});
interface Getable
{
public function get();
}
class APIClient implements Getable
{
public function get()
{
return 'yes!';
}
}
class APIClientDecorator implements Getable
{
private $client;
public function __construct(APIClient $client)
{
$this->client = $client;
}
public function get()
{
return 'no!';
}
}
class User
{
private $client;
public function __construct(Getable $client)
{
$this->client = $client;
}
}
$container->singleton(Auth::class, function (Container $container) {
$auth = new Auth;
$auth->setSession($container->make(Session::class));
$container->rebinding(Session::class, function ($container, $session) use ($auth) {
$auth->setSession($session);
});
return $auth;
});
$container->instance(Session::class, new Session(['username' => 'dave']));
$auth = $container->make(Auth::class);
echo $auth->username(); // dave
$container->instance(Session::class, new Session(['username' => 'danny']));
echo $auth->username(); // danny
$container->singleton(Auth::class, function (Container $container) {
$auth = new Auth;
$auth->setSession($container->make(Session::class));
$container->refresh(Session::class, $auth, 'setSession');
return $auth;
});
// This only works if you call singleton() or bind() on the class
$container->singleton(Session::class);
$container->singleton(Auth::class, function (Container $container) {
$auth = new Auth;
$auth->setSession($container->refresh(Session::class, $auth, 'setSession'));
return $auth;
});
class Post
{
public function __construct(Database $db, int $id) { /* ... */ }
}