coroq/container
Composer 安装命令:
composer require coroq/container
包简介
PSR-11 compatible dependency injection container
README 文档
README
A lightweight, PSR-11 compatible Dependency Injection Container for PHP.
Installation
composer require coroq/container
Quick Start
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
Features
- PSR-11 compatible (
Psr\Container\ContainerInterface) - Type-based or name-based autowiring
- Singleton support for classes and factories
- Namespace-based auto-resolution
- Circular dependency detection
Arguments Resolution
The container automatically resolves constructor and factory arguments.
Type-Based Resolution (Default)
Resolves arguments by their type declarations:
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);
Name-Based Resolution
Resolves arguments by their parameter names. Useful for configuration-driven projects:
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);
Advanced: Building Custom Container Hierarchies
For most use cases, OmniContainer is sufficient. This section is for users who need fine-grained control over container composition.
Container Types
StaticContainer - For explicitly registered entries:
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(); });
DynamicContainer - Auto-instantiates classes from registered namespaces:
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);
CompositeContainer - Delegates to multiple containers in order:
use Coroq\Container\CompositeContainer; $composite = new CompositeContainer(); $composite->addContainer($staticContainer); // checked first $composite->addContainer($dynamicContainer); // checked second $service = $composite->get('service'); // searches in order
Cascading Containers
When containers are nested, child containers may need to resolve dependencies registered in sibling or parent containers. The setRootContainer() method enables this:
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);
OmniContainer handles cascading automatically.
License
MIT License
coroq/container 适用场景与选型建议
coroq/container 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 107 次下载、GitHub Stars 达 0, 最近一次更新时间为 2023 年 03 月 31 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「dependency injection」 「container」 「di」 「lightweight」 「service container」 「Autowiring」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 coroq/container 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 coroq/container 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 coroq/container 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
A fast and intuitive dependency injection container.
Dependency injection container for the Monolith framework.
The PSR-11 container bridges
Http Microframework for Hack
PHP Dependency Injection Container
统计信息
- 总下载量: 107
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 0
- 点击次数: 32
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2023-03-31