psr-discovery / cache-implementations
这是一个轻量级库,通过搜索实现相关接口的知名类列表来发现可用的PSR-6缓存实现,并返回找到的第一个实例。
Requires
- php: ^8.1
- psr-discovery/discovery: ^1.0
- psr/cache: ^1.0 | ^2.0 | ^3.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-6缓存实现,并返回找到的第一个实例。
此软件包是PSR Discovery实用程序套件的一部分,该套件还支持PSR-18 HTTP客户端、PSR-17 HTTP工厂、PSR-14事件调度器、PSR-11容器和PSR-3日志。
这主要用于包含在希望支持PSR-6缓存而不需要依赖特定实现或要求用户进行额外配置的SDK等库中。
要求
- PHP 8.1+
- Composer 2.0+
成功发现需要宿主应用程序中存在兼容的实现。此库不会为您安装任何实现。
实现
以下自动发现并实例化的psr/cache-implementation
实现:
- cache/apcu-adapter ^1.0
- cache/array-adapter ^1.0
- cache/void-adapter ^1.0
- tedivm/stash ^0.14
以下实现可以被发现,但需要手动实例化,因为这些实现需要配置:
- apix/cache ^1.2
- cache/chain-adapter ^1.0
- cache/doctrine-adapter ^1.0
- cache/filesystem-adapter ^1.0
- cache/memcache-adapter ^1.
- cache/memcached-adapter ^1.0
- cache/mongodb-adapter ^1.0
- cache/predis-adapter ^1.0
- cache/redis-adapter ^1.0
- laminas/laminas-cache ^2.8 | ^3.0
- matthiasmullie/scrapbook ^1.0
- neos/cache ^4.0
- psx/cache ^1.0
- symfony/cache ^3.1 | ^4.0 | ^5.0 | ^6.0 | ^7.0
- symfony/symfony ^3.1.4 | ^4.0 | ^5.0 | ^6.0 | ^7.0
- tedivm/stash ^0.14
以下也是可用的模拟实现:
如果您希望看到缺失的特定实现,请打开一个拉取请求以添加支持。
安装
composer require psr-discovery/cache-implementations
使用
use PsrDiscovery\Discover; // Return an instance of the first discovered PSR-6 Cache implementation. $cache = Discover::cache(); $cache->set('foo', 'bar');
您还可以使用Discover::caches()
检索包含所有发现实现的数组。如果您想支持需要配置才能实例化的实现,这很有用。
use PsrDiscovery\Discover; $caches = Discover::caches(); foreach ($caches as $cache) { echo sprintf('Discovered %s v%s', $cache->getPackage(), $cache->getVersion()); }
处理失败
如果库无法发现合适的PSR-6实现,则Discover::cache()
发现方法将简单地返回null
。这允许您优雅地处理失败,例如通过回退到默认实现。
示例
use PsrDiscovery\Discover; $cache = Discover::cache(); if ($cache === null) { // No suitable Cache implementation was discovered. // Fall back to a default implementation. $cache = new DefaultCache(); }
单例
默认情况下,Discover::cache()
方法将始终返回一个发现实现的新的实例。如果您想使用单例实例,只需将 true
传递给发现方法的 $singleton
参数即可。
示例
use PsrDiscovery\Discover; // $cache1 !== $cache2 (default) $cache1 = Discover::cache(); $cache2 = Discover::cache(); // $cache1 === $cache2 $cache1 = Discover::cache(singleton: true); $cache2 = Discover::cache(singleton: true);
优先级模拟
此库将优先搜索已知、可用的模拟库,然后再搜索真实实现。这是为了让使用此库的代码更容易进行测试。
预期这些模拟库始终作为开发依赖项安装,因此如果它们可用,则打算使用。
偏好实现
如果您想优先选择特定的实现,可以通过包名进行 prefer()
。
use PsrDiscovery\Discover; use PsrDiscovery\Implementations\Psr6\Caches; // Prefer the a specific implementation of PSR-6 over others. Caches::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. $cache = Discover::cache();
这将导致当可用时,cache()
方法返回首选实现,否则将回退到默认行为。
请注意,分配首选实现将使其优先于模拟库的默认偏好。
使用特定实现
如果您想强制使用特定实现并忽略其他发现候选者,可以使用 use()
其包名。
use PsrDiscovery\Discover; use PsrDiscovery\Implementations\Psr6\Caches; // Only discover a specific implementation of PSR-6. Caches::use('league/container'); // Return an instance of League\Container\Container, // or null if it is not available. $cache = Discover::cache();
这将导致当可用时,cache()
方法返回首选实现,否则将返回 null
。
此库不是由PHP-FIG生产、推广或与之有其他关联。