bermudaphp/di-resolver
Composer 安装命令:
composer require bermudaphp/di-resolver
包简介
A powerful and flexible parameter resolution library for PHP that automatically resolves function and method parameters from various sources
关键字:
README 文档
README
A powerful and flexible parameter resolution library for PHP that automatically resolves function and method parameters from various sources including arrays, DI containers, and configuration.
Features
- Multiple Resolution Strategies: Resolve parameters by name, position, type, or attributes
- DI Container Integration: Seamless integration with PSR-11 containers
- Attribute Support: Native PHP 8+ attributes (
#[Config],#[Inject]) - Union Types: Full support for PHP 8 union types
- Extensible Architecture: Easy to add custom resolvers
- Zero Dependencies: Core functionality requires no external dependencies
- High Performance: Optimized resolver chain with early termination
Installation
composer require bermudaphp/di-resolver
Quick Start
use Bermuda\ParameterResolver\ParameterResolver; use Bermuda\ParameterResolver\ArrayResolver; use Bermuda\ParameterResolver\DefaultValueResolver; // Create resolver with basic resolvers $resolver = new ParameterResolver([ new ArrayResolver(), // Resolve from provided array new DefaultValueResolver() // Use default values ]); // Define a function function greetUser(string $name, string $greeting = 'Hello', ?int $age = null) { return "$greeting, $name" . ($age ? " (age: $age)" : ""); } // Resolve parameters $reflection = new ReflectionFunction('greetUser'); $parameters = $reflection->getParameters(); $resolvedParams = $resolver->resolve($parameters, [ 'name' => 'John', 'age' => 25 ]); // Result: ['John', 'Hello', 25] echo greetUser(...$resolvedParams); // "Hello, John (age: 25)"
Core Resolvers
ArrayResolver
Resolves parameters by name or position from provided array:
$resolver = new ArrayResolver(); // By name $params = ['username' => 'john', 'email' => 'john@example.com']; // By position $params = [0 => 'john', 1 => 'john@example.com'];
ArrayTypedResolver
Resolves parameters by object type scanning:
$resolver = new ArrayTypedResolver(); $params = [ 'userService' => new UserService(), 'logger' => new Logger() ]; function processUser(UserService $service, Logger $logger) { // Parameters resolved automatically by type }
ContainerResolver
Resolves from PSR-11 DI containers with attribute support:
use Bermuda\DI\Attribute\Config; use Bermuda\DI\Attribute\Inject; $resolver = new ContainerResolver($container); function createUser( #[Config('database.host')] string $dbHost, #[Inject('user.repository')] UserRepository $repo, UserService $service // Resolved by type from container ) { // All parameters resolved automatically }
DefaultValueResolver
Uses parameter default values:
function processData(array $data, bool $validate = true, ?string $format = null) { // $validate will be true, $format will be null if not provided }
NullableResolver
Resolves nullable parameters to null:
function optionalService(?LoggerInterface $logger = null) { // $logger will be null if not resolvable }
DI Container Integration
Full Integration Example
use Bermuda\ParameterResolver\ParameterResolver; // Create resolver with all standard resolvers $resolver = ParameterResolver::createDefaults($container); class UserController { public function createUser( #[Config('app.name')] string $appName, #[Inject('user.validator')] UserValidator $validator, UserRepository $repository, // From container by type array $userData, // From provided parameters bool $sendEmail = true, // Default value ?LoggerInterface $logger = null // Nullable fallback ) { // All parameters resolved automatically $user = new User($userData); if ($validator->validate($user)) { $repository->save($user); if ($sendEmail && $logger) { $logger->info("User created in $appName"); } } return $user; } } // Usage $method = new ReflectionMethod(UserController::class, 'createUser'); $resolvedParams = $resolver->resolve( $method->getParameters(), ['userData' => $_POST, 'sendEmail' => false] ); $controller = new UserController(); $user = $controller->createUser(...$resolvedParams);
Configuration Management
The Config attribute supports dot notation and various data sources:
use Bermuda\DI\Attribute\Config; // Simple config access function connectDatabase(#[Config('database.host')] string $host) {} // With default values function getApiKey(#[Config('api.key', 'default-key')] string $key) {} // Disable dot notation function getLiteralKey(#[Config('app.debug', explodeDots: false)] bool $debug) {} // Deep nesting function getNestedValue( #[Config('services.external.api.endpoints.users')] string $endpoint ) {}
ArrayAccess Support
$config = new ArrayObject([ 'database' => ['host' => 'localhost', 'port' => 3306] ]); $container->set('config', $config); function connect(#[Config('database.host')] string $host) { // Works with ArrayAccess objects }
Advanced Usage
Custom Resolvers
class EnvironmentResolver implements ParameterResolverInterface { public function resolve( ReflectionParameter $parameter, array $providedParameters = [], array $resolvedParameters = [] ): ?array { $envVar = 'APP_' . strtoupper($parameter->getName()); $value = $_ENV[$envVar] ?? null; return $value !== null ? [$parameter->getPosition(), $value] : null; } } // Add to resolver chain $resolver = new ParameterResolver([ new EnvironmentResolver(), new ArrayResolver(), new DefaultValueResolver() ]);
Union Type Support
function flexibleHandler(string|UserService $handler, int|float $value) { // Resolves first matching type from union } $params = [ 'UserService' => new UserService(), // Matches UserService from union 'value' => 42 // Matches int from union ];
Resolver Priorities
$resolver = new ParameterResolver([ new ArrayResolver(), // Priority 1: Explicit parameters new ArrayTypedResolver(), // Priority 2: Type matching new ContainerResolver($container), // Priority 3: DI container new DefaultValueResolver(), // Priority 4: Default values new NullableResolver() // Priority 5: Nullable fallback ]);
Error Handling
use Bermuda\ParameterResolver\ParameterResolutionException; try { $resolvedParams = $resolver->resolve($parameters, $providedParams); } catch (ParameterResolutionException $e) { echo "Failed to resolve parameter: " . $e->parameter->getName(); echo "Provided parameters: " . print_r($e->providedParameters, true); echo "Already resolved: " . print_r($e->resolvedParameters, true); }
Performance Tips
- Order resolvers by frequency - put most commonly used resolvers first
- Use typed parameters when possible for faster ArrayTypedResolver matching
- Avoid deep nesting in Config paths for better performance
- Cache reflection objects when resolving the same signatures repeatedly
Requirements
- PHP 8.4 or higher
License
MIT License. See LICENSE for details.
bermudaphp/di-resolver 适用场景与选型建议
bermudaphp/di-resolver 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 5 次下载、GitHub Stars 达 2, 最近一次更新时间为 2025 年 04 月 10 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「reflection」 「config」 「di」 「attributes」 「dependency-injection」 「PSR-11」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 bermudaphp/di-resolver 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 bermudaphp/di-resolver 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 bermudaphp/di-resolver 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Library emulating the PHP internal reflection using just the tokenized source code.
A Zend Framework module to quickly and easily set PHP settings.
Parse use statements for a reflection object
A library that allows you to easily use the PHP-VCR library in your PHPUnit tests.
This Package provides some usefully console features like the attribute syntax for arguments and options, validation, auto ask and casting.
Generate UML class diagrams by reflection for your PHP projects
统计信息
- 总下载量: 5
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 2
- 点击次数: 19
- 依赖项目数: 1
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2025-04-10