Registering Providers

Registering Multiple Providers

use FastForward\Container\ServiceProvider\ArrayServiceProvider;
use FastForward\Container\ServiceProvider\AggregateServiceProvider;
use function FastForward\Container\container;

$providerA = new ArrayServiceProvider([
    'mailer' => fn() => new Mailer(),
]);
$providerB = new ArrayServiceProvider([
    'notifier' => fn() => new Notifier(),
]);

$container = container($providerA, $providerB);
$mailer = $container->get('mailer');
$notifier = $container->get('notifier');

Extending Services with Providers

use FastForward\Container\ServiceProvider\ArrayServiceProvider;
use function FastForward\Container\container;

class UserRepository {
    public function setLogger($logger) { /* ... */ }
}

$provider = new ArrayServiceProvider([
    'user_repo' => fn() => new UserRepository(),
    'logger' => fn() => new Logger('app'),
], [
    'user_repo' => function ($container, $repo) {
        $repo->setLogger($container->get('logger'));
        return $repo;
    },
]);

$container = container($provider);
$repo = $container->get('user_repo');

Composing Providers for Feature Modules

use FastForward\Container\ServiceProvider\ArrayServiceProvider;
use FastForward\Container\ServiceProvider\AggregateServiceProvider;
use function FastForward\Container\container;

$userProvider = new ArrayServiceProvider([
    'user_service' => fn() => new UserService(),
]);
$authProvider = new ArrayServiceProvider([
    'auth_service' => fn($container) => new AuthService($container->get('user_service')),
]);

$aggregate = new AggregateServiceProvider($userProvider, $authProvider);
$container = container($aggregate);

$userService = $container->get('user_service');
$authService = $container->get('auth_service');

Using Providers with Config

use FastForward\Config\ArrayConfig;
use function FastForward\Container\container;
use FastForward\Container\ServiceProvider\ArrayServiceProvider;

$config = new ArrayConfig([
    FastForward\Container\ContainerInterface::class => [
        new ArrayServiceProvider([
            'settings' => fn() => [
                'debug' => true,
                'timezone' => 'UTC',
            ],
        ]),
    ],
]);

$container = container($config);
$settings = $container->get('settings');

Provider Returning a Factory

use FastForward\Container\ServiceProvider\ArrayServiceProvider;
use FastForward\Container\Factory\InvokableFactory;
use function FastForward\Container\container;

$provider = new ArrayServiceProvider([
    'service' => new InvokableFactory(MyService::class, 'arg1'),
]);

$container = container($provider);
$service = $container->get('service');

Provider with Extension for Caching

use FastForward\Container\ServiceProvider\ArrayServiceProvider;
use function FastForward\Container\container;

class Cache {
    public function enable() { /* ... */ }
}

$provider = new ArrayServiceProvider([
    'cache' => fn() => new Cache(),
], [
    'cache' => function ($container, $cache) {
        $cache->enable();
        return $cache;
    },
]);

$container = container($provider);
$cache = $container->get('cache');