PHP code example of coroq / container

1. Go to this page and download the library: Download coroq/container library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

coroq / container example snippets


use Coroq\Container\OmniContainer;

$container = new OmniContainer();

// Register a value
$container->setValue('app.name', 'My Application');
$container->get('app.name');  // => 'My Application'

// Register a class (new instance each time)
$container->setClass('userRepository', UserRepository::class);
$container->get('userRepository');  // => new UserRepository()
$container->get('userRepository');  // => new UserRepository() (different instance)

// Register a singleton class (same instance every time)
$container->setSingletonClass(Logger::class, Logger::class);
$container->get(Logger::class);  // => new Logger()
$container->get(Logger::class);  // => same Logger instance

// Register a factory with auto-resolved arguments
// By default, arguments are resolved by type (TypeBasedArgumentsResolver)
$container->setFactory('pdo', function(Logger $logger) {
    $logger->info('Creating PDO connection');
    return new PDO('mysql:host=localhost;dbname=app');
});
$container->get('pdo');  // => Logger is auto-injected, returns new PDO()

// Register a singleton factory
$container->setSingletonFactory('database', function(PDO $pdo, Logger $logger) {
    return new Database($pdo, $logger);
});
$container->get('database');  // => new Database() with PDO and Logger injected
$container->get('database');  // => same Database instance

// Create an alias
$container->setAlias('db', 'database');
$container->get('db');  // => same as $container->get('database')

// Auto-resolve classes from registered namespaces
// Note: Auto-resolved classes are cached (singleton behavior)
$container->addNamespace('App\\Domain');
$container->get(App\Domain\UserService::class);  // => auto-instantiated with dependencies
$container->get(App\Domain\UserService::class);  // => same instance (cached)

// Override auto-resolution behavior with explicit registration
$container->setClass(App\Domain\UserService::class, App\Domain\UserService::class);  // new instance each time
// or
$container->setSingletonClass(App\Domain\UserService::class, App\Domain\UserService::class);  // explicit singleton

use Coroq\Container\OmniContainer;

// TypeBasedArgumentsResolver is used by default
$container = new OmniContainer();

$container->setSingletonClass(Logger::class, Logger::class);
$container->setSingletonClass(UserRepository::class, UserRepository::class);

// UserService constructor: __construct(Logger $logger, UserRepository $repo)
// Both arguments are resolved by their class types
$container->setClass(UserService::class, UserService::class);

use Coroq\Container\OmniContainer;
use Coroq\Container\ArgumentsResolver\NameBasedArgumentsResolver;

$container = new OmniContainer(new NameBasedArgumentsResolver());

// Register entries - names must match parameter names exactly
$container->setValue('dsn', 'mysql:host=localhost;dbname=app');
$container->setValue('timeout', 30);
$container->setValue('logger', new Logger());

// Factory parameters $dsn, $timeout are resolved by name
$container->setSingletonFactory('database', function($dsn, $timeout) {
    return new Database($dsn, $timeout);
});

// Constructor parameter $logger is resolved by name
// class UserService { public function __construct($logger) { ... } }
$container->setClass('userService', UserService::class);

use Coroq\Container\StaticContainer;
use Coroq\Container\ArgumentsResolver\TypeBasedArgumentsResolver;

$container = new StaticContainer();
$container->setArgumentsResolver(new TypeBasedArgumentsResolver());

$container->setValue('appName', 'My App');
$container->setFactory('service', function() { return new Service(); });

use Coroq\Container\DynamicContainer;
use Coroq\Container\ArgumentsResolver\TypeBasedArgumentsResolver;

$container = new DynamicContainer();
$container->setArgumentsResolver(new TypeBasedArgumentsResolver());
$container->addNamespace('App\\Domain');

// Automatically creates App\Domain\UserService
// Instances are cached, behaving as singletons
$service = $container->get(App\Domain\UserService::class);

use Coroq\Container\CompositeContainer;

$composite = new CompositeContainer();
$composite->addContainer($staticContainer);   // checked first
$composite->addContainer($dynamicContainer);  // checked second

$service = $composite->get('service');  // searches in order

use Coroq\Container\StaticContainer;
use Coroq\Container\DynamicContainer;
use Coroq\Container\CompositeContainer;
use Coroq\Container\ArgumentsResolver\TypeBasedArgumentsResolver;

$resolver = new TypeBasedArgumentsResolver();

// Static container holds explicitly registered entries
$static = new StaticContainer();
$static->setArgumentsResolver($resolver);
$static->setSingletonClass(Logger::class, Logger::class);

// Dynamic container auto-instantiates from namespace
$dynamic = new DynamicContainer();
$dynamic->setArgumentsResolver($resolver);
$dynamic->addNamespace('App\\Domain');

// Composite container combines both
$root = new CompositeContainer();
$root->addContainer($static);
$root->addContainer($dynamic);

// Enable cascading: child containers resolve dependencies via root
$root->setRootContainer($root);

// Now DynamicContainer can resolve Logger (registered in StaticContainer)
// when instantiating App\Domain\UserService
$service = $root->get(App\Domain\UserService::class);