psr-discovery / event-dispatcher-implementations
这是一个轻量级的库,通过搜索实现相关接口的知名类列表来发现可用的PSR-14事件分发器实现,并返回找到的第一个实例。
Requires
- php: ^8.1
- psr-discovery/discovery: ^1.0
- psr/event-dispatcher: ^1.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-14事件分发器实现,并返回找到的第一个实例的轻量级库。
此包是PSR Discovery实用程序套件的一部分,该套件还支持PSR Discovery、PSR-18 HTTP客户端、PSR-17 HTTP工厂、PSR-11 容器、PSR-6 缓存和PSR-3 日志。
此库主要用于包含在需要支持PSR-14事件分发器但不需要对特定实现有硬依赖或要求用户进行额外配置的库(如SDK)中。
需求
- PHP 8.1+
- Composer 2.0+
成功发现需要宿主应用程序中存在兼容的实现。此库不会为您安装任何实现。
实现
以下psr/event-dispatcher-implementation
实现将被自动发现和实例化
- carlosas/simple-event-dispatcher ^0.1.0
- league/event ^3.0
- symfony/event-dispatcher ^4.3 | ^5.0 | ^6.0 | ^7.0
- yiisoft/event-dispatcher ^1.0
以下也是可用的模拟实现
如果您想看到缺少的特定实现,请提交一个添加支持的pull request。
安装
composer require psr-discovery/event-dispatcher-implementations
使用
use PsrDiscovery\Discover; // Return an instance of the first discovered PSR-14 Event Dispatcher implementation. $eventDispatcher = Discover::eventDispatcher(); // Send a request using the discovered Event Dispatcher. eventDispatcher->dispatch(...);
处理失败
如果库无法发现合适的PSR-14实现,则Discover::eventDispatcher()
发现方法将简单地返回null
。这允许您优雅地处理失败,例如通过回退到默认实现。
示例
use PsrDiscovery\Discover; $eventDispatcher = Discover::eventDispatcher(); if ($eventDispatcher === null) { // No suitable Event Dispatcher implementation was discovered. // Fall back to a default implementation. $eventDispatcher = new DefaultEventDispatcher(); }
单例
默认情况下,Discover::eventDispatcher()
方法将始终返回找到的实现的新实例。如果您希望使用单例实例,只需将true
传递给发现方法的$singleton
参数即可。
示例
use PsrDiscovery\Discover; // $eventDispatcher1 !== $eventDispatcher2 (default) $eventDispatcher1 = Discover::eventDispatcher(); $eventDispatcher2 = Discover::eventDispatcher(); // $eventDispatcher1 === $eventDispatcher2 $eventDispatcher1 = Discover::eventDispatcher(singleton: true); $eventDispatcher2 = Discover::eventDispatcher(singleton: true);
模拟优先级
此库将优先搜索已知、可用的模拟库,然后再搜索真实实现。这是为了便于测试使用此库的代码。
预期这些模拟库始终作为开发依赖项安装,因此如果它们可用,则打算使用它们。
优先实现
如果您想优先使用特定的实现,可以通过包名prefer()
它
use PsrDiscovery\Discover; use PsrDiscovery\Implementations\Psr14\EventDispatchers; // Prefer the a specific implementation of PSR-14 over others. EventDispatchers::prefer('league/event'); // Return an instance of League\Event\Dispatcher, // or the next available from the list of candidates, // Returns null if none are discovered. $dispatcher = Discover::eventDispatcher();
这将导致eventDispatcher()
方法在可用的情况下返回首选实现,否则将回退到默认行为。
请注意,分配首选实现将使它优于模拟库的默认偏好。
使用特定实现
如果您希望强制使用特定实现并忽略其他发现候选者,您可以 use()
它的包名
use PsrDiscovery\Discover; use PsrDiscovery\Implementations\Psr14\EventDispatchers; // Only discover a specific implementation of PSR-14. EventDispatchers::use('league/event'); // Return an instance of League\Event\Dispatcher, // or null if it is not available. $dispatcher = Discover::eventDispatcher();
这将导致 eventDispatcher()
方法返回首选实现(如果可用),否则返回 null
。
此库不是由PHP-FIG生产、推广或以其他方式关联的。