psr-discovery / container-implementations
这是一个轻量级库,通过搜索一组已知的实现相关接口的类来发现可用的PSR-11容器实现,并返回找到的第一个实例。
Requires
- php: ^8.1
- psr-discovery/discovery: ^1.0
- psr/container: ^1.0 | ^2.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.14
- mockery/mockery: ^1.5
- pestphp/pest: ^2.0
- phpstan/phpstan: ^1.10
- phpstan/phpstan-strict-rules: ^1.5
- rector/rector: ^0.15
- vimeo/psalm: ^5.8
- wikimedia/composer-merge-plugin: ^2.0
README
这是一个轻量级库,通过搜索一组已知的实现相关接口的类来发现可用的PSR-11 容器实现,并返回找到的第一个实例。
此包是PSR Discovery实用工具套件的一部分,该套件还支持PSR Discovery、PSR-18 HTTP 客户端、PSR-17 HTTP 工厂、PSR-14 事件调度器、PSR-6 缓存和PSR-3 日志。
此库主要用于包含在希望支持PSR-11容器而不需要依赖特定实现或要求用户进行额外配置的SDK等库中。
要求
- PHP 8.1+
- Composer 2.0+
成功发现需要宿主应用程序中存在兼容的实现。此库不会为您安装任何实现。
实现
以下自动发现并实例化的psr/container-implementation
实现:
- aura/di ^4.0
- contributte/psr11-container-interface ^0.4
- illuminate/container ^8.0 | ^9.0 | ^10.0
- joomla/di ^1.5 | ^2.0
- laminas/laminas-servicemanager ^3.3
- laravel/framework ^7.0 | ^8.0 | ^9.0 | ^10.0
- league/container ^3.0 | ^4.0
- php-di/php-di ^5.4.2 | ^6.0 | ^7.0
- silverstripe/framework ^4.0
- symfony/dependency-injection ^3.3 | ^4.0 | ^5.0 | ^6.0 | ^7.0
- symfony/symfony ^3.3 | ^4.0 | ^5.0 | ^6.0 | ^7.0
- yiisoft/di ^1.0
以下也是可用的模拟实现:
如果您缺少特定的实现,并希望添加支持,请提交一个pull request。
安装
composer require psr-discovery/container-implementations
使用
use PsrDiscovery\Discover; // Return an instance of the first discovered PSR-11 Container implementation. $container = Discover::container(); $container->get(...)
处理失败
如果库无法发现合适的PSR-11实现,则Discover::container()
发现方法将简单地返回null
。这允许您优雅地处理失败,例如回退到默认实现。
示例
use PsrDiscovery\Discover; $container = Discover::container(); if ($container === null) { // No suitable Container implementation was discovered. // Fall back to a default implementation. $container = new DefaultContainer(); }
单例
默认情况下,Discover::container()
方法将始终返回找到的实现的新实例。如果您希望使用单例实例,只需将true
传递给发现方法的$singleton
参数。
示例
use PsrDiscovery\Discover; // $container1 !== $container2 (default) $container1 = Discover::container(); $container2 = Discover::container(); // $container1 === $container2 $container1 = Discover::container(singleton: true); $container2 = Discover::container(singleton: true);
模拟优先级
此库将优先搜索已知、可用的模拟库,然后再搜索实际实现。这是为了便于测试使用此库的代码。
预期这些模拟库将始终作为开发依赖项安装,因此如果它们可用,则建议使用。
偏袒某个实现
如果您希望优先使用特定实现而不是其他实现,可以通过包名prefer()
它。
use PsrDiscovery\Discover; use PsrDiscovery\Implementations\Psr11\Containers; // Prefer the a specific implementation of PSR-11 over others. Containers::prefer('league/container'); // Return an instance of League\Container\Container, // or the next available from the list of candidates, // Returns null if none are discovered. $container = Discover::container();
这会导致container()
方法返回可用的首选实现,否则将回退到默认行为。
请注意,分配首选实现将使其优先于模拟库的默认偏好。
使用特定实现
如果您想强制使用特定实现并忽略其他发现候选者,您可以使用其包名use()
use PsrDiscovery\Discover; use PsrDiscovery\Implementations\Psr11\Containers; // Only discover a specific implementation of PSR-11. Containers::use('league/container'); // Return an instance of League\Container\Container, // or null if it is not available. $container = Discover::container();
如果可用,这将导致container()
方法返回首选实现,否则将返回null
。
本库不是由PHP-FIG生产、推荐或以其他方式关联的。