diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml
index aa632e5f..1cb260ff 100644
--- a/.github/workflows/continuous-integration.yml
+++ b/.github/workflows/continuous-integration.yml
@@ -27,9 +27,6 @@ jobs:
matrix:
include:
# Ubuntu: Test all PHP versions
- - os: ubuntu-latest
- php-version: "8.1"
- dependencies: highest
- os: ubuntu-latest
php-version: "8.2"
dependencies: lowest
diff --git a/.scrutinizer.yml b/.scrutinizer.yml
index 163a238b..c485693c 100644
--- a/.scrutinizer.yml
+++ b/.scrutinizer.yml
@@ -1,20 +1,15 @@
-filter:
- paths: ["src/*"]
-
-tools:
- php_sim: true
- php_pdepend: true
- php_analyzer: true
build:
- image: default-bionic
- nodes:
- analysis:
- tests:
- override:
- - php-scrutinizer-run --enable-security-analysis
+ image: default-jammy
environment:
- redis: true
php:
- version: 8.2
+ version: 8.4
pecl_extensions:
- redis
+ nodes:
+ analysis:
+ tests:
+ override:
+ - php-scrutinizer-run
+
+filter:
+ paths: ["src/*"]
diff --git a/ANNOTATION_TO_ATTRIBUTE.md b/ANNOTATION_TO_ATTRIBUTE.md
new file mode 100644
index 00000000..a6527415
--- /dev/null
+++ b/ANNOTATION_TO_ATTRIBUTE.md
@@ -0,0 +1,315 @@
+# Migrating from Doctrine Annotations to PHP 8 Attributes
+
+## Overview
+
+BEAR.QueryRepository 1.13.0 has removed the dependency on `doctrine/annotations` and now exclusively uses native PHP 8 attributes. This guide will help you migrate your application code from Doctrine annotations to PHP 8 attributes.
+
+## Why Migrate?
+
+- **doctrine/annotations is Abandoned**: The `doctrine/annotations` package has been officially abandoned by its maintainers. Continuing to use it poses security and compatibility risks as it will no longer receive updates or security patches.
+- **Native PHP Support**: PHP 8 attributes are a built-in language feature, providing first-class support without external dependencies
+- **Better Performance**: No runtime annotation parsing overhead - attributes are compiled and cached by PHP itself
+- **Modern Syntax**: Cleaner, more readable code that follows PHP 8+ best practices
+- **No Extra Dependencies**: Eliminates the need for the abandoned doctrine/annotations package
+- **Future-Proof**: Attributes are the official PHP standard for metadata, ensuring long-term compatibility
+
+## Migration Steps
+
+### Step 1: Install Rector (if not already installed)
+
+Rector is an automated refactoring tool that can convert annotations to attributes:
+
+```bash
+composer require --dev rector/rector
+```
+
+### Step 2: Run Automated Migration
+
+BEAR.QueryRepository provides a Rector configuration file for automated migration:
+
+```bash
+# Dry-run to preview changes
+vendor/bin/rector process src --config=vendor/bear/query-repository/rector-migrate.php --dry-run
+
+# Apply the changes
+vendor/bin/rector process src --config=vendor/bear/query-repository/rector-migrate.php
+```
+
+If you have tests that use annotations:
+
+```bash
+vendor/bin/rector process tests --config=vendor/bear/query-repository/rector-migrate.php
+```
+
+### Step 3: Manual Review
+
+Review the changes made by Rector and adjust if necessary. Pay special attention to:
+
+- Multi-line annotations with complex values
+- Annotations with custom parameters
+- Import statements (Rector should handle these automatically)
+
+### Step 4: Remove doctrine/annotations
+
+After migration, you can safely remove the doctrine/annotations dependency:
+
+```bash
+composer remove doctrine/annotations
+```
+
+## Before and After Examples
+
+### Cacheable Resource
+
+**Before (Doctrine Annotation):**
+```php
+use BEAR\RepositoryModule\Annotation\Cacheable;
+
+/**
+ * @Cacheable(expiry="short", type="value")
+ */
+class User extends ResourceObject
+{
+ public function onGet($id)
+ {
+ // ...
+ }
+}
+```
+
+**After (PHP 8 Attribute):**
+```php
+use BEAR\RepositoryModule\Annotation\Cacheable;
+
+#[Cacheable(expiry: "short", type: "value")]
+class User extends ResourceObject
+{
+ public function onGet($id)
+ {
+ // ...
+ }
+}
+```
+
+### HTTP Cache Headers
+
+**Before (Doctrine Annotation):**
+```php
+use BEAR\RepositoryModule\Annotation\HttpCache;
+
+/**
+ * @HttpCache(maxAge=60, sMaxAge=600)
+ */
+class News extends ResourceObject
+{
+ public function onGet()
+ {
+ // ...
+ }
+}
+```
+
+**After (PHP 8 Attribute):**
+```php
+use BEAR\RepositoryModule\Annotation\HttpCache;
+
+#[HttpCache(maxAge: 60, sMaxAge: 600)]
+class News extends ResourceObject
+{
+ public function onGet()
+ {
+ // ...
+ }
+}
+```
+
+### Cache Invalidation
+
+**Before (Doctrine Annotation):**
+```php
+use BEAR\RepositoryModule\Annotation\Refresh;
+use BEAR\RepositoryModule\Annotation\Purge;
+
+class User extends ResourceObject
+{
+ /**
+ * @Refresh(uri="app://self/users")
+ * @Purge(uri="app://self/user/{id}")
+ */
+ public function onPut($id, $name)
+ {
+ // ...
+ }
+}
+```
+
+**After (PHP 8 Attribute):**
+```php
+use BEAR\RepositoryModule\Annotation\Refresh;
+use BEAR\RepositoryModule\Annotation\Purge;
+
+class User extends ResourceObject
+{
+ #[Refresh(uri: "app://self/users")]
+ #[Purge(uri: "app://self/user/{id}")]
+ public function onPut($id, $name)
+ {
+ // ...
+ }
+}
+```
+
+### Complex Cache Configuration
+
+**Before (Doctrine Annotation):**
+```php
+use BEAR\RepositoryModule\Annotation\Cacheable;
+use BEAR\RepositoryModule\Annotation\HttpCache;
+
+/**
+ * @Cacheable(expiry="medium", expirySecond=3600, type="view", update=true)
+ * @HttpCache(maxAge=60, sMaxAge=600, isPrivate=false, mustRevalidate=true)
+ */
+class Article extends ResourceObject
+{
+ // ...
+}
+```
+
+**After (PHP 8 Attribute):**
+```php
+use BEAR\RepositoryModule\Annotation\Cacheable;
+use BEAR\RepositoryModule\Annotation\HttpCache;
+
+#[Cacheable(expiry: "medium", expirySecond: 3600, type: "view", update: true)]
+#[HttpCache(maxAge: 60, sMaxAge: 600, isPrivate: false, mustRevalidate: true)]
+class Article extends ResourceObject
+{
+ // ...
+}
+```
+
+### Donut Caching
+
+**Before (Doctrine Annotation):**
+```php
+use BEAR\RepositoryModule\Annotation\DonutCache;
+
+class Page extends ResourceObject
+{
+ /**
+ * @DonutCache
+ */
+ public function onGet()
+ {
+ // ...
+ }
+}
+```
+
+**After (PHP 8 Attribute):**
+```php
+use BEAR\RepositoryModule\Annotation\DonutCache;
+
+class Page extends ResourceObject
+{
+ #[DonutCache]
+ public function onGet()
+ {
+ // ...
+ }
+}
+```
+
+## Supported Annotations
+
+The following BEAR.QueryRepository annotations are automatically converted:
+
+- `@Cacheable` → `#[Cacheable]` - Resource caching configuration
+- `@HttpCache` → `#[HttpCache]` - HTTP cache control headers
+- `@NoHttpCache` → `#[NoHttpCache]` - Disable HTTP caching
+- `@Refresh` → `#[Refresh]` - Invalidate dependent caches
+- `@Purge` → `#[Purge]` - Purge specific cache entries
+- `@DonutCache` → `#[DonutCache]` - Donut caching pattern
+- `@RefreshCache` → `#[RefreshCache]` - Refresh cache after command
+- `@Commands` → `#[Commands]` - Cache invalidation commands
+
+**Note**: This migration tool only handles BEAR.QueryRepository annotations. For Ray.Di annotations (such as `@Inject`, `@Named`, etc.), please refer to the [Ray.Di migration guide](https://github.com/ray-di/Ray.Di).
+
+## Key Differences
+
+1. **Syntax Change**: Use `#[AttributeName]` instead of `@AttributeName` in docblocks
+2. **Named Parameters**: Use colons for parameters (e.g., `expiry: "short"` instead of `expiry="short"`)
+3. **Placement**: Attributes go before the class/method declaration, not in docblocks
+4. **Import Statements**: Add proper `use` statements for all attributes
+5. **Multiple Attributes**: Stack multiple attributes on separate lines or combine with commas
+
+## Troubleshooting
+
+### Rector doesn't find annotations
+
+Make sure your code is using fully qualified class names in `use` statements:
+
+```php
+// Correct
+use BEAR\RepositoryModule\Annotation\Cacheable;
+
+// Incorrect - Rector won't recognize this
+use BEAR\RepositoryModule\Annotation as Cache;
+```
+
+### Import statements not updated
+
+Rector should automatically update import statements, but if it doesn't:
+
+1. Manually verify `use` statements are present
+2. Run your IDE's "Optimize Imports" feature
+3. Use tools like PHP-CS-Fixer to clean up unused imports
+
+### Complex annotation values
+
+For annotations with complex array values, you may need to manually adjust the syntax:
+
+**Before:**
+```php
+/**
+ * @HttpCache(etag={"id", "updated_at"})
+ */
+```
+
+**After:**
+```php
+#[HttpCache(etag: ["id", "updated_at"])]
+```
+
+### Testing the migration
+
+After migration, ensure all tests pass:
+
+```bash
+vendor/bin/phpunit
+```
+
+## Manual Migration
+
+If you prefer not to use Rector, you can manually convert annotations:
+
+1. Replace `/** @AnnotationName */` with `#[AnnotationName]`
+2. Move attributes from docblocks to the line before the method/property/class
+3. Convert parameter syntax from `key="value"` to `key: "value"`
+4. Ensure all necessary `use` statements are present
+5. For multiple attributes, place each on a new line or combine: `#[Attr1, Attr2]`
+
+## Need Help?
+
+If you encounter issues during migration:
+
+1. Check the [BEAR.QueryRepository documentation](https://github.com/bearsunday/BEAR.QueryRepository)
+2. Review the [PHP 8 Attributes documentation](https://www.php.net/manual/en/language.attributes.php)
+3. [Open an issue](https://github.com/bearsunday/BEAR.QueryRepository/issues) on GitHub
+
+## References
+
+- [PHP 8 Attributes RFC](https://wiki.php.net/rfc/attributes_v2)
+- [Rector Documentation](https://github.com/rectorphp/rector)
+- [BEAR.Sunday Documentation](https://bearsunday.github.io/)
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5523fca5..aba75c6b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,9 +7,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
-## [1.13.0] - 2025-10-21
-
### Added
+- **Migration Tools**: Added `rector-migrate.php` for automated annotation-to-attribute migration
+- **Migration Guide**: Added `ANNOTATION_TO_ATTRIBUTE.md` with comprehensive migration instructions
- Add CLAUDE.md with comprehensive codebase architecture and development guide
- Add marshaller configuration support for Redis with compression options (deflate)
- Add `MarshallerType` enum for type-safe marshaller selection
@@ -25,6 +25,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Add PHP 8.5 support to CI workflow
### Changed
+- **PHP 8 Attributes Migration**: Removed `doctrine/annotations` and `doctrine/cache` dependencies, migrated to native PHP 8 attributes
+- **Minimum PHP Version**: Updated requirement from PHP 8.1 to PHP 8.2
+- Improve `rector-migrate.php` to support vendor installation by removing hardcoded paths
+- Update `ANNOTATION_TO_ATTRIBUTE.md` migration guide following Ray.AuraSqlModule pattern
- Improve marshaller provider error handling with better exception messages
- Enhance Memcached module with TagAwareAdapter support
- Update Symfony Cache to support version ^7.3
diff --git a/composer-require-checker.json b/composer-require-checker.json
index fcb00648..8e3a40e5 100644
--- a/composer-require-checker.json
+++ b/composer-require-checker.json
@@ -4,7 +4,9 @@
"static", "self", "parent",
"array", "string", "int", "float", "bool", "iterable", "callable", "void", "object",
"Attribute", "Memcached", "Redis", "RedisException",
- "Doctrine\\Common\\Cache\\ArrayCache", "Doctrine\\Common\\Cache\\MemcachedCache", "Doctrine\\Common\\Cache\\RedisCache",
+ "Doctrine\\Common\\Cache\\CacheProvider",
+ "Doctrine\\Common\\Cache\\MemcachedCache",
+ "Doctrine\\Common\\Cache\\RedisCache",
"BEAR\\FastlyModule\\FastlyCachePurgerInterface", "BEAR\\FastlyModule\\FastlyPurgeModule",
"Detection\\MobileDetect"
]
diff --git a/composer.json b/composer.json
index c61d45ca..ce9fa1cb 100644
--- a/composer.json
+++ b/composer.json
@@ -15,24 +15,20 @@
}
],
"require": {
- "php": "^8.1",
+ "php": "^8.2",
"bear/resource": "^1.16.1",
"bear/sunday": "^1.5",
- "doctrine/annotations": "^1.8 || ^2.0",
- "doctrine/cache": "^1.12 || ^2.0",
"psr/cache": "^1.0 || ^2.0 || ^3.0",
"ray/aop": "^2.16",
"ray/di": "^2.17.2",
- "ray/psr-cache-module": "^1.3.4",
+ "ray/psr-cache-module": "^1.5.1",
"symfony/cache": "^5.3 || ^6.0 || ^7.3",
"symfony/cache-contracts": "^2.4 || ^3.0",
"symfony/polyfill-php83": "^v1.32.0"
},
"require-dev": {
- "ext-redis": "*",
"bamarni/composer-bin-plugin": "^1.8",
"bear/fastly-module": "^1.0",
- "koriym/attributes": "^1.0.1",
"madapaja/twig-module": "^2.6",
"mobiledetect/mobiledetectlib": "^3.74 || ^4.8",
"phpunit/phpunit": "^9.6.23",
@@ -40,6 +36,10 @@
"symfony/process": "^6.1 || ^7.1",
"twig/twig": "^3.4.3"
},
+ "suggest": {
+ "ext-redis": "Required for Redis cache storage backend",
+ "ext-memcached": "Required for Memcached cache storage backend"
+ },
"autoload": {
"psr-4": {
"BEAR\\QueryRepository\\": ["src/", "src-deprecated/"],
diff --git a/demo/AppModule.php b/demo/AppModule.php
index a511f9f0..7c382315 100644
--- a/demo/AppModule.php
+++ b/demo/AppModule.php
@@ -5,10 +5,7 @@
namespace FakeVendor\DemoApp;
use BEAR\QueryRepository\QueryRepositoryModule;
-use BEAR\RepositoryModule\Annotation\Storage;
use BEAR\Resource\Module\ResourceModule;
-use Doctrine\Common\Cache\ArrayCache;
-use Doctrine\Common\Cache\CacheProvider;
use Ray\Di\AbstractModule;
use Ray\Di\Scope;
@@ -20,8 +17,6 @@ class AppModule extends AbstractModule
protected function configure()
{
$this->bind()->annotatedWith('storage_dir')->toInstance(__DIR__ . '/tmp')->in(Scope::SINGLETON);
- // $this->bind(CacheProvider::class)->annotatedWith(Storage::class)->toConstructor(FilesystemCache::class, 'directory=storage_dir')->in(Scope::SINGLETON);
- $this->bind(CacheProvider::class)->annotatedWith(Storage::class)->to(ArrayCache::class)->in(Scope::SINGLETON);
$this->install(new ResourceModule(__NAMESPACE__));
$this->install(new QueryRepositoryModule);
}
diff --git a/demo/Resource/App/User.php b/demo/Resource/App/User.php
index 8c0934e8..510e9064 100644
--- a/demo/Resource/App/User.php
+++ b/demo/Resource/App/User.php
@@ -8,9 +8,6 @@
use BEAR\Resource\ResourceObject;
use function error_log;
-/**
- * @Cacheable(expirySecond=300)
- */
#[Cacheable]
class User extends ResourceObject
{
diff --git a/phpcs.xml b/phpcs.xml
index 2a16700c..e1b79edf 100755
--- a/phpcs.xml
+++ b/phpcs.xml
@@ -8,8 +8,8 @@
-
-
+
+
diff --git a/phpstan.neon b/phpstan.neon
index 8529a8f3..f91ed7ed 100644
--- a/phpstan.neon
+++ b/phpstan.neon
@@ -18,9 +18,5 @@ parameters:
- */tests/tmp/*
- */tests/Fake/*
- */src/StorageRedisCacheProvider.php*
- ignoreErrors:
- -
- message: '#but return statement is missing#'
- path: tests/ResourceRepositoryTest.php
stubFiles:
- tests/stubs/Injector.phpstub
diff --git a/rector-migrate.php b/rector-migrate.php
new file mode 100644
index 00000000..23ebb114
--- /dev/null
+++ b/rector-migrate.php
@@ -0,0 +1,37 @@
+withConfiguredRule(
+ AnnotationToAttributeRector::class,
+ [
+ // BEAR.QueryRepository Annotations
+ new AnnotationToAttribute('BEAR\RepositoryModule\Annotation\Cacheable'),
+ new AnnotationToAttribute('BEAR\RepositoryModule\Annotation\HttpCache'),
+ new AnnotationToAttribute('BEAR\RepositoryModule\Annotation\NoHttpCache'),
+ new AnnotationToAttribute('BEAR\RepositoryModule\Annotation\Refresh'),
+ new AnnotationToAttribute('BEAR\RepositoryModule\Annotation\Purge'),
+ new AnnotationToAttribute('BEAR\RepositoryModule\Annotation\DonutCache'),
+ new AnnotationToAttribute('BEAR\RepositoryModule\Annotation\RefreshCache'),
+ new AnnotationToAttribute('BEAR\RepositoryModule\Annotation\Commands'),
+ ]
+ );
\ No newline at end of file
diff --git a/src-annotation-deprecated/CacheVersion.php b/src-annotation-deprecated/CacheVersion.php
index e98a1529..0abf788c 100644
--- a/src-annotation-deprecated/CacheVersion.php
+++ b/src-annotation-deprecated/CacheVersion.php
@@ -5,20 +5,15 @@
namespace BEAR\RepositoryModule\Annotation;
use Attribute;
-use Doctrine\Common\Annotations\NamedArgumentConstructorAnnotation;
use Ray\Di\Di\Qualifier;
/**
* @deprecated
*
* Use \Ray\PsrCacheModule\Annotation\CacheNamespace
- *
- * @Annotation
- * @Target("METHOD")
- * @Qualifier()
*/
#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_PARAMETER), Qualifier]
-final class CacheVersion implements NamedArgumentConstructorAnnotation
+final class CacheVersion
{
/**
* @var string
diff --git a/src-annotation/CacheEngine.php b/src-annotation/CacheEngine.php
index de6b18cf..c25200d8 100644
--- a/src-annotation/CacheEngine.php
+++ b/src-annotation/CacheEngine.php
@@ -5,15 +5,8 @@
namespace BEAR\RepositoryModule\Annotation;
use Attribute;
-use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor;
use Ray\Di\Di\Qualifier;
-/**
- * @Annotation
- * @Target("METHOD")
- * @Qualifier()
- * @NamedArgumentConstructor()
- */
#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_PROPERTY)]
#[Qualifier]
final class CacheEngine
diff --git a/src-annotation/Cacheable.php b/src-annotation/Cacheable.php
index c74e3f71..27790af0 100644
--- a/src-annotation/Cacheable.php
+++ b/src-annotation/Cacheable.php
@@ -5,15 +5,7 @@
namespace BEAR\RepositoryModule\Annotation;
use Attribute;
-use BEAR\QueryRepository\CacheInterceptor;
-use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor;
-/**
- * @Annotation
- * @Target("CLASS")
- * @see CacheInterceptor
- * @NamedArgumentConstructor()
- */
#[Attribute(Attribute::TARGET_CLASS)]
final class Cacheable
{
diff --git a/src-annotation/CacheableResponse.php b/src-annotation/CacheableResponse.php
index 39055a02..c1e9e822 100644
--- a/src-annotation/CacheableResponse.php
+++ b/src-annotation/CacheableResponse.php
@@ -10,8 +10,6 @@
use BEAR\QueryRepository\DonutCommandInterceptor;
/**
- * @Annotation
- * @Target({"METHOD","CLASS"})
* @see DonutCacheModule
* @see DonutCacheableResponseInterceptor
* @see DonutCommandInterceptor
diff --git a/src-annotation/Commands.php b/src-annotation/Commands.php
index 7dabad70..1d8ed536 100644
--- a/src-annotation/Commands.php
+++ b/src-annotation/Commands.php
@@ -8,9 +8,6 @@
use Ray\Di\Di\Qualifier;
/**
- * @Annotation
- * @Target("METHOD")
- * @Qualifier
*/
#[Attribute(Attribute::TARGET_METHOD | Attribute::TARGET_PARAMETER)]
#[Qualifier]
diff --git a/src-annotation/DonutCache.php b/src-annotation/DonutCache.php
index 2571e0a2..0a0331bb 100644
--- a/src-annotation/DonutCache.php
+++ b/src-annotation/DonutCache.php
@@ -9,8 +9,6 @@
use BEAR\QueryRepository\DonutCommandInterceptor;
/**
- * @Annotation
- * @Target({"METHOD","CLASS"})
* @see DonutCacheModule
* @see DonutCacheInterceptor
* @see DonutCommandInterceptor
diff --git a/src-annotation/HttpCache.php b/src-annotation/HttpCache.php
index 449b0353..47e66684 100644
--- a/src-annotation/HttpCache.php
+++ b/src-annotation/HttpCache.php
@@ -6,7 +6,6 @@
use Attribute;
use BEAR\QueryRepository\HttpCacheInterceptor;
-use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor;
use function implode;
use function sprintf;
@@ -16,11 +15,6 @@
*
* Builds a complex Cache-Control header
*
- * @Annotation
- * @Target("CLASS")
- * @NamedArgumentConstructor()
- *
- * {@inheritDoc}
* @see HttpCacheInterceptor
*/
#[Attribute(Attribute::TARGET_CLASS)]
diff --git a/src-annotation/KnownTagTtl.php b/src-annotation/KnownTagTtl.php
index 4c279758..cd70d519 100644
--- a/src-annotation/KnownTagTtl.php
+++ b/src-annotation/KnownTagTtl.php
@@ -5,14 +5,8 @@
namespace BEAR\RepositoryModule\Annotation;
use Attribute;
-use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor;
use Ray\Di\Di\Qualifier;
-/**
- * @Annotation
- * @Qualifier
- * @NamedArgumentConstructor
- */
#[Attribute(Attribute::TARGET_PARAMETER | Attribute::TARGET_METHOD)]
#[Qualifier]
final class KnownTagTtl
diff --git a/src-annotation/Memcache.php b/src-annotation/Memcache.php
index edf7187f..6a7d67d6 100644
--- a/src-annotation/Memcache.php
+++ b/src-annotation/Memcache.php
@@ -5,15 +5,8 @@
namespace BEAR\RepositoryModule\Annotation;
use Attribute;
-use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor;
use Ray\Di\Di\Qualifier;
-/**
- * @Annotation
- * @Target("METHOD")
- * @Qualifier()
- * @NamedArgumentConstructor()
- */
#[Attribute(Attribute::TARGET_METHOD)]
#[Qualifier]
final class Memcache
diff --git a/src-annotation/NoHttpCache.php b/src-annotation/NoHttpCache.php
index dde82d56..4298621f 100644
--- a/src-annotation/NoHttpCache.php
+++ b/src-annotation/NoHttpCache.php
@@ -12,8 +12,6 @@
*
* Simplified notation to say that you don't want anything cached
*
- * @Annotation
- * @Target("CLASS")
* @see HttpCacheInterceptor
*/
#[Attribute(Attribute::TARGET_CLASS)]
diff --git a/src-annotation/Purge.php b/src-annotation/Purge.php
index 2dae7d7b..147caa55 100644
--- a/src-annotation/Purge.php
+++ b/src-annotation/Purge.php
@@ -5,14 +5,8 @@
namespace BEAR\RepositoryModule\Annotation;
use Attribute;
-use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor;
-/**
- * @Annotation
- * @Target("METHOD")
- * @NamedArgumentConstructor()
- * @see RefreshInterceptor
- */
+/** @see RefreshInterceptor */
#[Attribute(Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)]
final class Purge extends AbstractCommand
{
diff --git a/src-annotation/Redis.php b/src-annotation/Redis.php
index 47a27e40..b0dd3136 100644
--- a/src-annotation/Redis.php
+++ b/src-annotation/Redis.php
@@ -5,15 +5,8 @@
namespace BEAR\RepositoryModule\Annotation;
use Attribute;
-use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor;
use Ray\Di\Di\Qualifier;
-/**
- * @Annotation
- * @Target("METHOD")
- * @Qualifier()
- * @NamedArgumentConstructor()
- */
#[Attribute(Attribute::TARGET_METHOD)]
#[Qualifier]
final class Redis
diff --git a/src-annotation/Refresh.php b/src-annotation/Refresh.php
index 4a1500ef..1f096d2a 100644
--- a/src-annotation/Refresh.php
+++ b/src-annotation/Refresh.php
@@ -6,14 +6,8 @@
use Attribute;
use BEAR\QueryRepository\RefreshInterceptor;
-use Doctrine\Common\Annotations\Annotation\NamedArgumentConstructor;
-/**
- * @Annotation
- * @Target("METHOD")
- * @NamedArgumentConstructor()
- * @see RefreshInterceptor
- */
+/** @see RefreshInterceptor */
#[Attribute(Attribute::TARGET_METHOD | Attribute::IS_REPEATABLE)]
final class Refresh extends AbstractCommand
{
diff --git a/src-annotation/RefreshCache.php b/src-annotation/RefreshCache.php
index d9a6a756..cee83590 100644
--- a/src-annotation/RefreshCache.php
+++ b/src-annotation/RefreshCache.php
@@ -8,8 +8,6 @@
use BEAR\QueryRepository\DonutCommandInterceptor;
/**
- * @Annotation
- * @Target("METHOD")
* @see DonutCommandInterceptor
*/
#[Attribute(Attribute::TARGET_METHOD)]
diff --git a/src-deprecated/BcModule.php b/src-deprecated/BcModule.php
index ce581f0e..8be7c525 100644
--- a/src-deprecated/BcModule.php
+++ b/src-deprecated/BcModule.php
@@ -4,21 +4,15 @@
namespace BEAR\QueryRepository;
-use BEAR\QueryRepository\HttpCacheInterface as DeprecatedHttpCacheInterface;
-use BEAR\RepositoryModule\Annotation\CacheVersion;
-use BEAR\RepositoryModule\Annotation\Storage;
-use Doctrine\Common\Cache\ArrayCache;
-use Doctrine\Common\Cache\Cache;
-use Doctrine\Common\Cache\CacheProvider;
use Ray\Di\AbstractModule;
-use Ray\Di\Scope;
+use function trigger_error;
/**
* @deprecated
*
* Backward Compatibility module
*
- * Install this when you need deprecated interface.
+ * Install this when you need a deprecated interface.
* (I don't think it' ever going to be needed, but just in case.)
*/
class BcModule extends AbstractModule
@@ -28,11 +22,6 @@ class BcModule extends AbstractModule
*/
protected function configure()
{
- $this->bind(DeprecatedHttpCacheInterface::class)->to(HttpCache::class);
- /** @psalm-suppress DeprecatedClass */
- $this->bind(Cache::class)->annotatedWith(Storage::class)->toProvider(StorageProvider::class)->in(Scope::SINGLETON);
- /** @psalm-suppress DeprecatedClass */
- $this->bind(CacheProvider::class)->annotatedWith(Storage::class)->to(ArrayCache::class)->in(Scope::SINGLETON);
- $this->bind()->annotatedWith(CacheVersion::class)->toInstance('');
+ trigger_error('BEAR\QueryRepository\BcModule is deprecated.', E_USER_DEPRECATED);
}
}
diff --git a/src/HttpCacheInterceptor.php b/src/HttpCacheInterceptor.php
index f740761b..26c94c08 100644
--- a/src/HttpCacheInterceptor.php
+++ b/src/HttpCacheInterceptor.php
@@ -5,6 +5,8 @@
namespace BEAR\QueryRepository;
use BEAR\RepositoryModule\Annotation\AbstractCacheControl;
+use BEAR\RepositoryModule\Annotation\HttpCache;
+use BEAR\RepositoryModule\Annotation\NoHttpCache;
use BEAR\Resource\ResourceObject;
use Override;
use Ray\Aop\MethodInterceptor;
@@ -20,7 +22,13 @@ final class HttpCacheInterceptor implements MethodInterceptor
#[Override]
public function invoke(MethodInvocation $invocation)
{
- $cacheControl = $invocation->getMethod()->getDeclaringClass()->getAnnotation(AbstractCacheControl::class);
+ $class = $invocation->getMethod()->getDeclaringClass();
+ $attributes = $class->getAttributes(HttpCache::class);
+ if (empty($attributes)) {
+ $attributes = $class->getAttributes(NoHttpCache::class);
+ }
+
+ $cacheControl = isset($attributes[0]) ? $attributes[0]->newInstance() : null;
$ro = $invocation->proceed();
assert($ro instanceof ResourceObject);
if ($ro->code === 200 && $cacheControl instanceof AbstractCacheControl) {
diff --git a/src/QueryRepository.php b/src/QueryRepository.php
index c4d9500d..f6e0e15e 100644
--- a/src/QueryRepository.php
+++ b/src/QueryRepository.php
@@ -9,7 +9,6 @@
use BEAR\RepositoryModule\Annotation\HttpCache;
use BEAR\Resource\AbstractUri;
use BEAR\Resource\ResourceObject;
-use Doctrine\Common\Annotations\Reader;
use Override;
use ReflectionClass;
@@ -24,7 +23,6 @@ public function __construct(
private readonly RepositoryLoggerInterface $logger,
private readonly HeaderSetter $headerSetter,
private readonly ResourceStorageInterface $storage,
- private readonly Reader $reader,
private readonly Expiry $expiry,
) {
}
@@ -85,12 +83,16 @@ public function purge(AbstractUri $uri)
private function getHttpCacheAnnotation(ResourceObject $ro): HttpCache|null
{
- return $this->reader->getClassAnnotation(new ReflectionClass($ro), HttpCache::class);
+ $attributes = (new ReflectionClass($ro))->getAttributes(HttpCache::class);
+
+ return isset($attributes[0]) ? $attributes[0]->newInstance() : null;
}
private function getCacheableAnnotation(ResourceObject $ro): Cacheable|null
{
- return $this->reader->getClassAnnotation(new ReflectionClass($ro), Cacheable::class);
+ $attributes = (new ReflectionClass($ro))->getAttributes(Cacheable::class);
+
+ return isset($attributes[0]) ? $attributes[0]->newInstance() : null;
}
private function getExpiryTime(ResourceObject $ro, Cacheable|null $cacheable = null): int
diff --git a/tests-pecl-ext/StorageRedisDsnModuleTest.php b/tests-pecl-ext/StorageRedisDsnModuleTest.php
index 5abc929f..b127cce3 100644
--- a/tests-pecl-ext/StorageRedisDsnModuleTest.php
+++ b/tests-pecl-ext/StorageRedisDsnModuleTest.php
@@ -20,6 +20,9 @@
use function getenv;
use function usleep;
+/**
+ * @requires extension redis
+ */
class StorageRedisDsnModuleTest extends TestCase
{
/** @var Process */
diff --git a/tests-php8/AttributeTest.php b/tests-php8/AttributeTest.php
index e0fc0b9f..2e7a3ac4 100644
--- a/tests-php8/AttributeTest.php
+++ b/tests-php8/AttributeTest.php
@@ -8,45 +8,36 @@
use BEAR\RepositoryModule\Annotation\NoHttpCache;
use BEAR\RepositoryModule\Annotation\Purge;
use BEAR\RepositoryModule\Annotation\Refresh;
-use Doctrine\Common\Annotations\AnnotationReader;
-use Doctrine\Common\Annotations\Reader;
-use Koriym\Attributes\AttributeReader;
use PHPUnit\Framework\TestCase;
use ReflectionClass;
use ReflectionMethod;
class AttributeTest extends TestCase
{
- /** @var Reader */
- protected $reader;
-
- /**
- * @return array
- */
- public function readerProvider() : array
- {
- return [
- [new AttributeReader()],
- [new AnnotationReader()]
- ];
- }
-
- /**
- * @dataProvider readerProvider
- */
- public function testReadAttributes(Reader $reader) : void
+ public function testReadAttributes() : void
{
$class = new ReflectionClass(FakeAttributes::class);
- $cacheable = $reader->getClassAnnotation($class, Cacheable::class);
+
+ $cacheableAttrs = $class->getAttributes(Cacheable::class);
+ $this->assertNotEmpty($cacheableAttrs);
+ $cacheable = $cacheableAttrs[0]->newInstance();
$this->assertInstanceOf(Cacheable::class, $cacheable);
- $noHttpCache = $reader->getClassAnnotation($class, NoHttpCache::class);
- $this->assertInstanceOf(NoHttpCache::class, $noHttpCache);
- $noHttpCache = $reader->getClassAnnotation($class, NoHttpCache::class);
+
+ $noHttpCacheAttrs = $class->getAttributes(NoHttpCache::class);
+ $this->assertNotEmpty($noHttpCacheAttrs);
+ $noHttpCache = $noHttpCacheAttrs[0]->newInstance();
$this->assertInstanceOf(NoHttpCache::class, $noHttpCache);
+
$method = new ReflectionMethod(FakeAttributes::class, 'onGet');
- $purge = $reader->getMethodAnnotation($method, Purge::class);
+
+ $purgeAttrs = $method->getAttributes(Purge::class);
+ $this->assertNotEmpty($purgeAttrs);
+ $purge = $purgeAttrs[0]->newInstance();
$this->assertInstanceOf(Purge::class, $purge);
- $refresh = $reader->getMethodAnnotation($method, Refresh::class);
+
+ $refreshAttrs = $method->getAttributes(Refresh::class);
+ $this->assertNotEmpty($refreshAttrs);
+ $refresh = $refreshAttrs[0]->newInstance();
$this->assertInstanceOf(Refresh::class, $refresh);
}
}
diff --git a/tests/DonutCommandRedisCacheTest.php b/tests/DonutCommandRedisCacheTest.php
index 5a8d347f..3ce976e6 100644
--- a/tests/DonutCommandRedisCacheTest.php
+++ b/tests/DonutCommandRedisCacheTest.php
@@ -14,6 +14,7 @@
use function serialize;
use function unserialize;
+/** @requires extension redis */
class DonutCommandRedisCacheTest extends DonutCommandInterceptorTest
{
protected function setUp(): void
diff --git a/tests/Fake/fake-app/src/Resource/App/Code.php b/tests/Fake/fake-app/src/Resource/App/Code.php
index c6a0e26f..a45f5ebc 100644
--- a/tests/Fake/fake-app/src/Resource/App/Code.php
+++ b/tests/Fake/fake-app/src/Resource/App/Code.php
@@ -9,9 +9,6 @@
use BEAR\RepositoryModule\Annotation\Cacheable;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable
- */
#[Cacheable]
class Code extends ResourceObject
{
diff --git a/tests/Fake/fake-app/src/Resource/App/ControlExpiry.php b/tests/Fake/fake-app/src/Resource/App/ControlExpiry.php
index b90bd5b4..cf8d6647 100644
--- a/tests/Fake/fake-app/src/Resource/App/ControlExpiry.php
+++ b/tests/Fake/fake-app/src/Resource/App/ControlExpiry.php
@@ -9,9 +9,6 @@
use BEAR\RepositoryModule\Annotation\Cacheable;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable(expiryAt="expiry_at")
- */
#[Cacheable(expiryAt: "expiry_at")]
class ControlExpiry extends ResourceObject
{
diff --git a/tests/Fake/fake-app/src/Resource/App/ControlExpiryError.php b/tests/Fake/fake-app/src/Resource/App/ControlExpiryError.php
index 35643a1a..fa8cdb95 100644
--- a/tests/Fake/fake-app/src/Resource/App/ControlExpiryError.php
+++ b/tests/Fake/fake-app/src/Resource/App/ControlExpiryError.php
@@ -9,9 +9,6 @@
use BEAR\RepositoryModule\Annotation\Cacheable;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable(expiryAt="expiry_at")
- */
#[Cacheable(expiryAt: "expiry_at")]
class ControlExpiryError extends ResourceObject
{
diff --git a/tests/Fake/fake-app/src/Resource/App/ControlNone.php b/tests/Fake/fake-app/src/Resource/App/ControlNone.php
index 3837ffd7..2aea2eea 100644
--- a/tests/Fake/fake-app/src/Resource/App/ControlNone.php
+++ b/tests/Fake/fake-app/src/Resource/App/ControlNone.php
@@ -9,9 +9,6 @@
use BEAR\RepositoryModule\Annotation\Cacheable;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable(expirySecond=60)
- */
#[Cacheable(expirySecond: 60)]
class ControlNone extends ResourceObject
{
diff --git a/tests/Fake/fake-app/src/Resource/App/ControlPublic.php b/tests/Fake/fake-app/src/Resource/App/ControlPublic.php
index 2dd74d48..ceb7e84c 100644
--- a/tests/Fake/fake-app/src/Resource/App/ControlPublic.php
+++ b/tests/Fake/fake-app/src/Resource/App/ControlPublic.php
@@ -9,9 +9,6 @@
use BEAR\RepositoryModule\Annotation\Cacheable;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable(expirySecond=60)
- */
#[Cacheable(expirySecond: 60)]
class ControlPublic extends ResourceObject
{
diff --git a/tests/Fake/fake-app/src/Resource/App/Dep/LevelOne.php b/tests/Fake/fake-app/src/Resource/App/Dep/LevelOne.php
index 2a00e2e7..27c22172 100644
--- a/tests/Fake/fake-app/src/Resource/App/Dep/LevelOne.php
+++ b/tests/Fake/fake-app/src/Resource/App/Dep/LevelOne.php
@@ -6,16 +6,12 @@
use BEAR\Resource\Annotation\Embed;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable
- */
#[Cacheable]
class LevelOne extends ResourceObject
{
public $body = ['level-one' => 1];
/**
- * @Embed(rel="level-two", src="/dep/level-two")
*/
#[Embed(src: '/dep/level-two', rel: 'two')]
public function onGet()
diff --git a/tests/Fake/fake-app/src/Resource/App/Entry.php b/tests/Fake/fake-app/src/Resource/App/Entry.php
index 7ca0c516..c25d1be0 100644
--- a/tests/Fake/fake-app/src/Resource/App/Entry.php
+++ b/tests/Fake/fake-app/src/Resource/App/Entry.php
@@ -12,9 +12,6 @@
use BEAR\Resource\Code;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable(expiry="never", update=true)
- */
#[Cacheable(expiry: "never", update: true)]
class Entry extends ResourceObject
{
@@ -42,8 +39,6 @@ public function onPatch($id, $name)
}
/**
- * @Purge(uri="app://self/user/friend?user_id={id}")
- * @Refresh(uri="app://self/user/profile?user_id={id}")
*/
public function onPut(mixed $id, mixed $name, mixed $age)
{
diff --git a/tests/Fake/fake-app/src/Resource/App/Etag.php b/tests/Fake/fake-app/src/Resource/App/Etag.php
index a52b90ff..f156b09b 100644
--- a/tests/Fake/fake-app/src/Resource/App/Etag.php
+++ b/tests/Fake/fake-app/src/Resource/App/Etag.php
@@ -10,10 +10,6 @@
use BEAR\RepositoryModule\Annotation\HttpCache;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable
- * @HttpCache(etag={"updated_at"})
- */
#[Cacheable, HttpCache(etag: ["updated_at"])]
class Etag extends ResourceObject
{
diff --git a/tests/Fake/fake-app/src/Resource/App/HttpCacheControl.php b/tests/Fake/fake-app/src/Resource/App/HttpCacheControl.php
index 588e2639..1bd550f5 100644
--- a/tests/Fake/fake-app/src/Resource/App/HttpCacheControl.php
+++ b/tests/Fake/fake-app/src/Resource/App/HttpCacheControl.php
@@ -9,9 +9,6 @@
use BEAR\RepositoryModule\Annotation\HttpCache;
use BEAR\Resource\ResourceObject;
-/**
- * @HttpCache(isPrivate=true, maxAge=0, sMaxAge=0, mustRevalidate=true, noStore=true, noCache=true)
- */
#[HttpCache(isPrivate: true, maxAge: 0, sMaxAge: 0, mustRevalidate: true, noStore: true, noCache: true)]
class HttpCacheControl extends ResourceObject
{
diff --git a/tests/Fake/fake-app/src/Resource/App/HttpCacheControlOverrideMaxAge.php b/tests/Fake/fake-app/src/Resource/App/HttpCacheControlOverrideMaxAge.php
index 656ab5ca..399be00d 100644
--- a/tests/Fake/fake-app/src/Resource/App/HttpCacheControlOverrideMaxAge.php
+++ b/tests/Fake/fake-app/src/Resource/App/HttpCacheControlOverrideMaxAge.php
@@ -10,10 +10,6 @@
use BEAR\RepositoryModule\Annotation\HttpCache;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable(expirySecond=10)
- * @HttpCache(maxAge=5)
- */
#[Cacheable(expirySecond: 10), HttpCache(maxAge: 5)]
class HttpCacheControlOverrideMaxAge extends ResourceObject
{
diff --git a/tests/Fake/fake-app/src/Resource/App/HttpCacheControlWithCacheable.php b/tests/Fake/fake-app/src/Resource/App/HttpCacheControlWithCacheable.php
index 23eb1a81..10ee4e0e 100644
--- a/tests/Fake/fake-app/src/Resource/App/HttpCacheControlWithCacheable.php
+++ b/tests/Fake/fake-app/src/Resource/App/HttpCacheControlWithCacheable.php
@@ -10,10 +10,6 @@
use BEAR\RepositoryModule\Annotation\HttpCache;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable(expirySecond=10)
- * @HttpCache(isPrivate=true)
- */
#[Cacheable(expirySecond: 10), HttpCache(isPrivate: true)]
class HttpCacheControlWithCacheable extends ResourceObject
{
diff --git a/tests/Fake/fake-app/src/Resource/App/Invalid.php b/tests/Fake/fake-app/src/Resource/App/Invalid.php
index a4661579..8bc22407 100644
--- a/tests/Fake/fake-app/src/Resource/App/Invalid.php
+++ b/tests/Fake/fake-app/src/Resource/App/Invalid.php
@@ -10,9 +10,6 @@
use BEAR\RepositoryModule\Annotation\Purge;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable
- */
#[Cacheable]
class Invalid extends ResourceObject
{
diff --git a/tests/Fake/fake-app/src/Resource/App/NoHttpCacheControl.php b/tests/Fake/fake-app/src/Resource/App/NoHttpCacheControl.php
index 57bcc521..607f3a9b 100644
--- a/tests/Fake/fake-app/src/Resource/App/NoHttpCacheControl.php
+++ b/tests/Fake/fake-app/src/Resource/App/NoHttpCacheControl.php
@@ -9,9 +9,6 @@
use BEAR\RepositoryModule\Annotation\NoHttpCache;
use BEAR\Resource\ResourceObject;
-/**
- * @NoHttpCache
- */
#[NoHttpCache]
class NoHttpCacheControl extends ResourceObject
{
diff --git a/tests/Fake/fake-app/src/Resource/App/NullView.php b/tests/Fake/fake-app/src/Resource/App/NullView.php
index 74484dd6..279dd063 100644
--- a/tests/Fake/fake-app/src/Resource/App/NullView.php
+++ b/tests/Fake/fake-app/src/Resource/App/NullView.php
@@ -9,9 +9,6 @@
use BEAR\RepositoryModule\Annotation\Cacheable;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable(type="view")
- */
#[Cacheable(type: "view")]
class NullView extends ResourceObject
{
diff --git a/tests/Fake/fake-app/src/Resource/App/SometimesSameResponse.php b/tests/Fake/fake-app/src/Resource/App/SometimesSameResponse.php
index 7d836ecb..8165461c 100644
--- a/tests/Fake/fake-app/src/Resource/App/SometimesSameResponse.php
+++ b/tests/Fake/fake-app/src/Resource/App/SometimesSameResponse.php
@@ -9,9 +9,6 @@
use BEAR\RepositoryModule\Annotation\Cacheable;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable
- */
#[Cacheable]
class SometimesSameResponse extends ResourceObject
{
diff --git a/tests/Fake/fake-app/src/Resource/App/TypedParam.php b/tests/Fake/fake-app/src/Resource/App/TypedParam.php
index 177f346a..063647c3 100644
--- a/tests/Fake/fake-app/src/Resource/App/TypedParam.php
+++ b/tests/Fake/fake-app/src/Resource/App/TypedParam.php
@@ -10,9 +10,6 @@
use BEAR\RepositoryModule\Annotation\Refresh;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable
- */
#[Cacheable]
class TypedParam extends ResourceObject
{
@@ -26,7 +23,6 @@ public function onGet(int $id) : ResourceObject
}
/**
- * @Refresh(uri="app://self/typed-param{?id}")
*/
public function onPut(int $id) : ResourceObject
{
diff --git a/tests/Fake/fake-app/src/Resource/App/Unmatch.php b/tests/Fake/fake-app/src/Resource/App/Unmatch.php
index 2de53e09..cb564fee 100644
--- a/tests/Fake/fake-app/src/Resource/App/Unmatch.php
+++ b/tests/Fake/fake-app/src/Resource/App/Unmatch.php
@@ -11,9 +11,6 @@
use BEAR\RepositoryModule\Annotation\Purge;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable
- */
#[Cacheable]
class Unmatch extends ResourceObject
{
@@ -28,7 +25,6 @@ public function onGet($id, $unused)
}
/**
- * @Purge(uri="app://self/user/friend?user_id={id}")
*/
#[Purge(uri: 'app://self/user/friend?user_id={id}')]
public function onPut(mixed $id, mixed $name, mixed $age)
diff --git a/tests/Fake/fake-app/src/Resource/App/User.php b/tests/Fake/fake-app/src/Resource/App/User.php
index db8c8245..6df24d37 100644
--- a/tests/Fake/fake-app/src/Resource/App/User.php
+++ b/tests/Fake/fake-app/src/Resource/App/User.php
@@ -13,9 +13,6 @@
use BEAR\Resource\Code;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable
- */
#[Cacheable]
class User extends ResourceObject
{
@@ -49,12 +46,6 @@ public function onPatch($id, $name)
return $this;
}
- /**
- * @Purge(uri="app://self/user/friend?user_id={id}")
- * @Refresh(uri="app://self/user/profile?user_id={id}")
- *
- * @FakeAnnotation // ignored in RefreshAnnotatedCommand::request. This was put for the test coverage.
- */
#[Purge(uri: "app://self/user/friend?user_id={id}")]
#[Refresh(uri: "app://self/user/profile?user_id={id}")]
#[FakeAnnotation]
diff --git a/tests/Fake/fake-app/src/Resource/App/User/Profile.php b/tests/Fake/fake-app/src/Resource/App/User/Profile.php
index c3751412..df35eedb 100644
--- a/tests/Fake/fake-app/src/Resource/App/User/Profile.php
+++ b/tests/Fake/fake-app/src/Resource/App/User/Profile.php
@@ -9,9 +9,6 @@
use BEAR\RepositoryModule\Annotation\Cacheable;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable
- */
#[Cacheable]
class Profile extends ResourceObject
{
diff --git a/tests/Fake/fake-app/src/Resource/App/Value.php b/tests/Fake/fake-app/src/Resource/App/Value.php
index b0184d47..f6b29c7f 100644
--- a/tests/Fake/fake-app/src/Resource/App/Value.php
+++ b/tests/Fake/fake-app/src/Resource/App/Value.php
@@ -9,9 +9,6 @@
use BEAR\RepositoryModule\Annotation\Cacheable;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable(type="value")
- */
#[Cacheable(type: "value")]
class Value extends ResourceObject
{
diff --git a/tests/Fake/fake-app/src/Resource/App/View.php b/tests/Fake/fake-app/src/Resource/App/View.php
index a2c3835e..1485a6bc 100644
--- a/tests/Fake/fake-app/src/Resource/App/View.php
+++ b/tests/Fake/fake-app/src/Resource/App/View.php
@@ -9,9 +9,6 @@
use BEAR\RepositoryModule\Annotation\Cacheable;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable(type="view")
- */
#[Cacheable(type: 'view')]
class View extends ResourceObject
{
diff --git a/tests/Fake/fake-app/src/Resource/Page/Dep/LevelOne.php b/tests/Fake/fake-app/src/Resource/Page/Dep/LevelOne.php
index 5a158d34..d7e8cbf5 100644
--- a/tests/Fake/fake-app/src/Resource/Page/Dep/LevelOne.php
+++ b/tests/Fake/fake-app/src/Resource/Page/Dep/LevelOne.php
@@ -6,16 +6,12 @@
use BEAR\Resource\Annotation\Embed;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable
- */
#[Cacheable]
class LevelOne extends ResourceObject
{
public $body = ['level-one' => 1];
/**
- * @Embed(rel="level-two", src="/dep/level-two")
*/
#[Embed(rel: 'level-two', src: '/dep/level-two')]
public function onGet()
diff --git a/tests/Fake/fake-app/src/Resource/Page/Dep/LevelThree.php b/tests/Fake/fake-app/src/Resource/Page/Dep/LevelThree.php
index df409b7b..3bf5b7cf 100644
--- a/tests/Fake/fake-app/src/Resource/Page/Dep/LevelThree.php
+++ b/tests/Fake/fake-app/src/Resource/Page/Dep/LevelThree.php
@@ -6,9 +6,6 @@
use BEAR\Resource\Annotation\Embed;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable
- */
#[Cacheable]
class LevelThree extends ResourceObject
{
diff --git a/tests/Fake/fake-app/src/Resource/Page/Dep/LevelTwo.php b/tests/Fake/fake-app/src/Resource/Page/Dep/LevelTwo.php
index 83466272..f9caa915 100644
--- a/tests/Fake/fake-app/src/Resource/Page/Dep/LevelTwo.php
+++ b/tests/Fake/fake-app/src/Resource/Page/Dep/LevelTwo.php
@@ -6,16 +6,12 @@
use BEAR\Resource\Annotation\Embed;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable
- */
#[Cacheable]
class LevelTwo extends ResourceObject
{
public $body = ['level-two' => 1];
/**
- * @Embed(rel="level-three", src="/dep/level-three")
*/
#[Embed(rel: 'level-three', src: '/dep/level-three')]
public function onGet()
diff --git a/tests/Fake/fake-app/src/Resource/Page/EmbVal.php b/tests/Fake/fake-app/src/Resource/Page/EmbVal.php
index 19d47038..51f3f1a2 100644
--- a/tests/Fake/fake-app/src/Resource/Page/EmbVal.php
+++ b/tests/Fake/fake-app/src/Resource/Page/EmbVal.php
@@ -10,14 +10,10 @@
use BEAR\Resource\Annotation\Embed;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable
- */
#[Cacheable]
class EmbVal extends ResourceObject
{
/**
- * @Embed(rel="time", src="page://self/none");
*/
#[Embed(rel: "time", src: "page://self/none")]
public function onGet() : ResourceObject
diff --git a/tests/Fake/fake-app/src/Resource/Page/EmbView.php b/tests/Fake/fake-app/src/Resource/Page/EmbView.php
index 78c9e4b9..7aa52cdb 100644
--- a/tests/Fake/fake-app/src/Resource/Page/EmbView.php
+++ b/tests/Fake/fake-app/src/Resource/Page/EmbView.php
@@ -10,14 +10,10 @@
use BEAR\Resource\Annotation\Embed;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable(type="view")
- */
#[Cacheable(type: "view")]
class EmbView extends ResourceObject
{
/**
- * @Embed(rel="time", src="page://self/none")
*/
#[Embed(rel: "time", src: "page://self/none")]
public function onGet() : ResourceObject
diff --git a/tests/Fake/fake-app/src/Resource/Page/Html/BlogPosting.php b/tests/Fake/fake-app/src/Resource/Page/Html/BlogPosting.php
index 73d6d6ec..d4dfad12 100644
--- a/tests/Fake/fake-app/src/Resource/Page/Html/BlogPosting.php
+++ b/tests/Fake/fake-app/src/Resource/Page/Html/BlogPosting.php
@@ -10,14 +10,10 @@
use Koriym\HttpConstants\CacheControl;
use Koriym\HttpConstants\ResponseHeader;
-/**
- * @CacheableResponse
- */
#[CacheableResponse]
class BlogPosting extends ResourceObject
{
/**
- * @Embed(rel="comment", src="page://self/html/comment")
*/
#[Embed(rel: "comment", src: "page://self/html/comment")]
public function onGet(int $id = 0)
diff --git a/tests/Fake/fake-app/src/Resource/Page/Html/BlogPostingCache.php b/tests/Fake/fake-app/src/Resource/Page/Html/BlogPostingCache.php
index d371f850..150d8189 100644
--- a/tests/Fake/fake-app/src/Resource/Page/Html/BlogPostingCache.php
+++ b/tests/Fake/fake-app/src/Resource/Page/Html/BlogPostingCache.php
@@ -17,8 +17,6 @@ class BlogPostingCache extends ResourceObject
];
/**
- * @Embed(rel="comment", src="page://self/html/comment")
- * @CacheableResponse
*/
#[CacheableResponse]
#[Embed(rel: "comment", src: "page://self/html/comment")]
@@ -30,7 +28,6 @@ public function onGet(int $id = 0)
}
/**
- * @RefreshCache()
*/
#[RefreshCache]
public function onDelete(int $id = 0)
diff --git a/tests/Fake/fake-app/src/Resource/Page/Html/BlogPostingCacheControl.php b/tests/Fake/fake-app/src/Resource/Page/Html/BlogPostingCacheControl.php
index 13b53ecd..a43dae33 100644
--- a/tests/Fake/fake-app/src/Resource/Page/Html/BlogPostingCacheControl.php
+++ b/tests/Fake/fake-app/src/Resource/Page/Html/BlogPostingCacheControl.php
@@ -9,9 +9,6 @@
use Koriym\HttpConstants\CacheControl;
use Koriym\HttpConstants\RequestHeader;
-/**
- * @CacheableResponse
- */
#[CacheableResponse]
class BlogPostingCacheControl extends ResourceObject
{
@@ -25,7 +22,6 @@ public function __construct(
}
/**
- * @Embed(rel="comment", src="page://self/html/comment")
*/
#[Embed(rel: "comment", src: "page://self/html/comment")]
public function onGet()
diff --git a/tests/Fake/fake-app/src/Resource/Page/Html/BlogPostingDonut.php b/tests/Fake/fake-app/src/Resource/Page/Html/BlogPostingDonut.php
index 59b55785..436686dc 100644
--- a/tests/Fake/fake-app/src/Resource/Page/Html/BlogPostingDonut.php
+++ b/tests/Fake/fake-app/src/Resource/Page/Html/BlogPostingDonut.php
@@ -6,15 +6,9 @@
use BEAR\Resource\Annotation\Embed;
use BEAR\Resource\ResourceObject;
-/**
- * @DonutCache
- */
#[DonutCache]
class BlogPostingDonut extends ResourceObject
{
- /**
- * @Embed(rel="comment", src="page://self/html/comment")
- */
#[Embed(rel: "comment", src: "page://self/html/comment")]
public function onGet(int $id = 0)
{
diff --git a/tests/Fake/fake-app/src/Resource/Page/Html/Comment.php b/tests/Fake/fake-app/src/Resource/Page/Html/Comment.php
index 11620da7..9db2953d 100644
--- a/tests/Fake/fake-app/src/Resource/Page/Html/Comment.php
+++ b/tests/Fake/fake-app/src/Resource/Page/Html/Comment.php
@@ -8,14 +8,10 @@
use BEAR\Resource\Code;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable
- */
#[Cacheable]
class Comment extends ResourceObject
{
/**
- * @Embed(rel="like", src="page://self/html/like")
*/
#[Embed(rel: "like", src: "page://self/html/like")]
public function onGet()
diff --git a/tests/Fake/fake-app/src/Resource/Page/Html/Like.php b/tests/Fake/fake-app/src/Resource/Page/Html/Like.php
index bb9687a2..726a9a81 100644
--- a/tests/Fake/fake-app/src/Resource/Page/Html/Like.php
+++ b/tests/Fake/fake-app/src/Resource/Page/Html/Like.php
@@ -6,9 +6,6 @@
use BEAR\Resource\Annotation\Embed;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable
- */
#[Cacheable(type: 'view')]
class Like extends ResourceObject
{
diff --git a/tests/Fake/fake-app/src/Resource/Page/Html/PageSurrogateKey.php b/tests/Fake/fake-app/src/Resource/Page/Html/PageSurrogateKey.php
index cd158f6b..9d8bed7b 100644
--- a/tests/Fake/fake-app/src/Resource/Page/Html/PageSurrogateKey.php
+++ b/tests/Fake/fake-app/src/Resource/Page/Html/PageSurrogateKey.php
@@ -11,14 +11,10 @@
use BEAR\Resource\Annotation\Embed;
use BEAR\Resource\ResourceObject;
-/**
- * @CacheableResponse
- */
#[CacheableResponse]
class PageSurrogateKey extends ResourceObject
{
/**
- * @Embed(rel="comment", src="page://self/html/comment")
*/
#[Embed(rel: "comment", src: "page://self/html/comment")]
public function onGet() : ResourceObject
diff --git a/tests/Fake/fake-app/src/Resource/Page/Index.php b/tests/Fake/fake-app/src/Resource/Page/Index.php
index ff497cf7..f1a2783f 100644
--- a/tests/Fake/fake-app/src/Resource/Page/Index.php
+++ b/tests/Fake/fake-app/src/Resource/Page/Index.php
@@ -9,9 +9,6 @@
use BEAR\RepositoryModule\Annotation\Cacheable;
use BEAR\Resource\ResourceObject;
-/**
- * @Cacheable
- */
#[Cacheable]
class Index extends ResourceObject
{
diff --git a/tests/QueryRepositoryTest.php b/tests/QueryRepositoryTest.php
index e422edd6..3b13d7df 100644
--- a/tests/QueryRepositoryTest.php
+++ b/tests/QueryRepositoryTest.php
@@ -11,8 +11,6 @@
use BEAR\Resource\ResourceInterface;
use BEAR\Resource\Uri;
use BEAR\Sunday\Extension\Transfer\HttpCacheInterface;
-use Doctrine\Common\Annotations\AnnotationReader;
-use Doctrine\Common\Annotations\Reader;
use FakeVendor\HelloWorld\Resource\App\NullView;
use FakeVendor\HelloWorld\Resource\App\User\Profile;
use FakeVendor\HelloWorld\Resource\Page\None;
@@ -222,7 +220,6 @@ protected function configure(): void
{
$this->bind(CacheItemPoolInterface::class)->annotatedWith(Shared::class)->to(FilesystemAdapter::class);
$this->bind(CacheItemPoolInterface::class)->annotatedWith(EtagPool::class)->to(FilesystemAdapter::class);
- $this->bind(Reader::class)->to(AnnotationReader::class);
}
});
$injector = new Injector($module);
diff --git a/tests/ResourceRepositoryTest.php b/tests/ResourceRepositoryTest.php
index 4d3160b2..673376b8 100644
--- a/tests/ResourceRepositoryTest.php
+++ b/tests/ResourceRepositoryTest.php
@@ -6,8 +6,6 @@
use BEAR\QueryRepository\QueryRepository as Repository;
use BEAR\Resource\Uri;
-use Doctrine\Common\Annotations\AnnotationReader;
-use Doctrine\Common\Cache\CacheProvider;
use FakeVendor\HelloWorld\Resource\Page\Index;
use PHPUnit\Framework\TestCase;
use Ray\Di\ProviderInterface;
@@ -49,7 +47,6 @@ public function get()
$tagAwareAdapterProvider,
$tagAwareAdapterProvider,
),
- new AnnotationReader(),
new Expiry(0, 0, 0),
);
$this->ro = new Index();
@@ -89,32 +86,6 @@ public function testDelete(): void
public function testCreateFromDoctrineAnnotation(): void
{
- // phpcs:disable SlevomatCodingStandard.TypeHints.ParameterTypeHint.MissingAnyTypeHint
- $doctrineCache = new class extends CacheProvider{
- protected function doFetch($id)
- {
- }
-
- protected function doContains($id)
- {
- }
-
- protected function doSave($id, $data, $lifeTime = 0)
- {
- }
-
- protected function doDelete($id)
- {
- }
-
- protected function doFlush()
- {
- }
-
- protected function doGetStats()
- {
- }
- };
// phpcs:enable
$tagAwareAdapter = new TagAwareAdapter(new NullAdapter());
$tagAwareAdapterProvider = new class ($tagAwareAdapter) implements ProviderInterface{
@@ -138,7 +109,6 @@ public function get()
$tagAwareAdapterProvider,
$tagAwareAdapterProvider,
),
- new AnnotationReader(),
new Expiry(0, 0, 0),
);
$this->assertInstanceOf(Repository::class, $repository);
diff --git a/tests/StorageRedisDsnModuleMarshallerTest.php b/tests/StorageRedisDsnModuleMarshallerTest.php
index c8d1a4b6..d8ce64ca 100644
--- a/tests/StorageRedisDsnModuleMarshallerTest.php
+++ b/tests/StorageRedisDsnModuleMarshallerTest.php
@@ -9,6 +9,7 @@
use Ray\Di\Injector;
use Symfony\Component\Cache\Adapter\TagAwareAdapterInterface;
+/** @requires extension redis */
final class StorageRedisDsnModuleMarshallerTest extends TestCase
{
public function testModuleBindings(): void
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
index b64d04d2..53b2de3a 100644
--- a/tests/bootstrap.php
+++ b/tests/bootstrap.php
@@ -2,9 +2,4 @@
declare(strict_types=1);
-use Koriym\Attributes\AttributeReader;
-use Ray\ServiceLocator\ServiceLocator;
-
array_map('unlink', glob(__DIR__ . '/tests/tmp/*.php')); // @phpstan-ignore-line
-
-ServiceLocator::setReader(new AttributeReader());
diff --git a/vendor-bin/tool/composer.json b/vendor-bin/tool/composer.json
deleted file mode 100644
index 9e26dfee..00000000
--- a/vendor-bin/tool/composer.json
+++ /dev/null
@@ -1 +0,0 @@
-{}
\ No newline at end of file
diff --git a/vendor-bin/tool/composer.lock b/vendor-bin/tool/composer.lock
deleted file mode 100644
index b383d88a..00000000
--- a/vendor-bin/tool/composer.lock
+++ /dev/null
@@ -1,18 +0,0 @@
-{
- "_readme": [
- "This file locks the dependencies of your project to a known state",
- "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
- "This file is @generated automatically"
- ],
- "content-hash": "d751713988987e9331980363e24189ce",
- "packages": [],
- "packages-dev": [],
- "aliases": [],
- "minimum-stability": "stable",
- "stability-flags": {},
- "prefer-stable": false,
- "prefer-lowest": false,
- "platform": {},
- "platform-dev": {},
- "plugin-api-version": "2.6.0"
-}
diff --git a/vendor-bin/tools/composer.json b/vendor-bin/tools/composer.json
index f8efd849..ba0760e9 100644
--- a/vendor-bin/tools/composer.json
+++ b/vendor-bin/tools/composer.json
@@ -11,6 +11,9 @@
"allow-plugins": {
"dealerdirect/phpcodesniffer-composer-installer": true
},
- "sort-packages": true
+ "sort-packages": true,
+ "platform": {
+ "php": "8.4.99"
+ }
}
}
diff --git a/vendor-bin/tools/composer.lock b/vendor-bin/tools/composer.lock
index 703390b9..9c741c3e 100644
--- a/vendor-bin/tools/composer.lock
+++ b/vendor-bin/tools/composer.lock
@@ -4,21 +4,21 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "0f42766d36d7379bb2634d8f8565e169",
+ "content-hash": "47b44077ff0b2feaad0b5161f9f64bfc",
"packages": [],
"packages-dev": [
{
"name": "amphp/amp",
- "version": "v3.1.0",
+ "version": "v3.1.1",
"source": {
"type": "git",
"url": "https://github.com/amphp/amp.git",
- "reference": "7cf7fef3d667bfe4b2560bc87e67d5387a7bcde9"
+ "reference": "fa0ab33a6f47a82929c38d03ca47ebb71086a93f"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/amphp/amp/zipball/7cf7fef3d667bfe4b2560bc87e67d5387a7bcde9",
- "reference": "7cf7fef3d667bfe4b2560bc87e67d5387a7bcde9",
+ "url": "https://api.github.com/repos/amphp/amp/zipball/fa0ab33a6f47a82929c38d03ca47ebb71086a93f",
+ "reference": "fa0ab33a6f47a82929c38d03ca47ebb71086a93f",
"shasum": ""
},
"require": {
@@ -78,7 +78,7 @@
],
"support": {
"issues": "https://github.com/amphp/amp/issues",
- "source": "https://github.com/amphp/amp/tree/v3.1.0"
+ "source": "https://github.com/amphp/amp/tree/v3.1.1"
},
"funding": [
{
@@ -86,7 +86,7 @@
"type": "github"
}
],
- "time": "2025-01-26T16:07:39+00:00"
+ "time": "2025-08-27T21:42:00+00:00"
},
{
"name": "amphp/byte-stream",
@@ -319,16 +319,16 @@
},
{
"name": "amphp/parallel",
- "version": "v2.3.1",
+ "version": "v2.3.2",
"source": {
"type": "git",
"url": "https://github.com/amphp/parallel.git",
- "reference": "5113111de02796a782f5d90767455e7391cca190"
+ "reference": "321b45ae771d9c33a068186b24117e3cd1c48dce"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/amphp/parallel/zipball/5113111de02796a782f5d90767455e7391cca190",
- "reference": "5113111de02796a782f5d90767455e7391cca190",
+ "url": "https://api.github.com/repos/amphp/parallel/zipball/321b45ae771d9c33a068186b24117e3cd1c48dce",
+ "reference": "321b45ae771d9c33a068186b24117e3cd1c48dce",
"shasum": ""
},
"require": {
@@ -391,7 +391,7 @@
],
"support": {
"issues": "https://github.com/amphp/parallel/issues",
- "source": "https://github.com/amphp/parallel/tree/v2.3.1"
+ "source": "https://github.com/amphp/parallel/tree/v2.3.2"
},
"funding": [
{
@@ -399,7 +399,7 @@
"type": "github"
}
],
- "time": "2024-12-21T01:56:09+00:00"
+ "time": "2025-08-27T21:55:40+00:00"
},
{
"name": "amphp/parser",
@@ -896,16 +896,16 @@
},
{
"name": "composer/semver",
- "version": "3.4.3",
+ "version": "3.4.4",
"source": {
"type": "git",
"url": "https://github.com/composer/semver.git",
- "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12"
+ "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/composer/semver/zipball/4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
- "reference": "4313d26ada5e0c4edfbd1dc481a92ff7bff91f12",
+ "url": "https://api.github.com/repos/composer/semver/zipball/198166618906cb2de69b95d7d47e5fa8aa1b2b95",
+ "reference": "198166618906cb2de69b95d7d47e5fa8aa1b2b95",
"shasum": ""
},
"require": {
@@ -957,7 +957,7 @@
"support": {
"irc": "ircs://irc.libera.chat:6697/composer",
"issues": "https://github.com/composer/semver/issues",
- "source": "https://github.com/composer/semver/tree/3.4.3"
+ "source": "https://github.com/composer/semver/tree/3.4.4"
},
"funding": [
{
@@ -967,13 +967,9 @@
{
"url": "https://github.com/composer",
"type": "github"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/composer/composer",
- "type": "tidelift"
}
],
- "time": "2024-09-19T14:15:21+00:00"
+ "time": "2025-08-20T19:15:30+00:00"
},
{
"name": "composer/xdebug-handler",
@@ -1139,28 +1135,28 @@
},
{
"name": "dealerdirect/phpcodesniffer-composer-installer",
- "version": "v1.0.0",
+ "version": "v1.1.2",
"source": {
"type": "git",
"url": "https://github.com/PHPCSStandards/composer-installer.git",
- "reference": "4be43904336affa5c2f70744a348312336afd0da"
+ "reference": "e9cf5e4bbf7eeaf9ef5db34938942602838fc2b1"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/4be43904336affa5c2f70744a348312336afd0da",
- "reference": "4be43904336affa5c2f70744a348312336afd0da",
+ "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/e9cf5e4bbf7eeaf9ef5db34938942602838fc2b1",
+ "reference": "e9cf5e4bbf7eeaf9ef5db34938942602838fc2b1",
"shasum": ""
},
"require": {
- "composer-plugin-api": "^1.0 || ^2.0",
+ "composer-plugin-api": "^2.2",
"php": ">=5.4",
"squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0"
},
"require-dev": {
- "composer/composer": "*",
+ "composer/composer": "^2.2",
"ext-json": "*",
"ext-zip": "*",
- "php-parallel-lint/php-parallel-lint": "^1.3.1",
+ "php-parallel-lint/php-parallel-lint": "^1.4.0",
"phpcompatibility/php-compatibility": "^9.0",
"yoast/phpunit-polyfills": "^1.0"
},
@@ -1180,9 +1176,9 @@
"authors": [
{
"name": "Franck Nijhof",
- "email": "franck.nijhof@dealerdirect.com",
- "homepage": "http://www.frenck.nl",
- "role": "Developer / IT Manager"
+ "email": "opensource@frenck.dev",
+ "homepage": "https://frenck.dev",
+ "role": "Open source developer"
},
{
"name": "Contributors",
@@ -1190,7 +1186,6 @@
}
],
"description": "PHP_CodeSniffer Standards Composer Installer Plugin",
- "homepage": "http://www.dealerdirect.com",
"keywords": [
"PHPCodeSniffer",
"PHP_CodeSniffer",
@@ -1211,9 +1206,28 @@
],
"support": {
"issues": "https://github.com/PHPCSStandards/composer-installer/issues",
+ "security": "https://github.com/PHPCSStandards/composer-installer/security/policy",
"source": "https://github.com/PHPCSStandards/composer-installer"
},
- "time": "2023-01-05T11:28:13+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/PHPCSStandards",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/jrfnl",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/php_codesniffer",
+ "type": "open_collective"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/phpcsstandards",
+ "type": "thanks_dev"
+ }
+ ],
+ "time": "2025-07-17T20:45:56+00:00"
},
{
"name": "dnoegel/php-xdg-base-dir",
@@ -1414,16 +1428,16 @@
},
{
"name": "fidry/cpu-core-counter",
- "version": "1.2.0",
+ "version": "1.3.0",
"source": {
"type": "git",
"url": "https://github.com/theofidry/cpu-core-counter.git",
- "reference": "8520451a140d3f46ac33042715115e290cf5785f"
+ "reference": "db9508f7b1474469d9d3c53b86f817e344732678"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/8520451a140d3f46ac33042715115e290cf5785f",
- "reference": "8520451a140d3f46ac33042715115e290cf5785f",
+ "url": "https://api.github.com/repos/theofidry/cpu-core-counter/zipball/db9508f7b1474469d9d3c53b86f817e344732678",
+ "reference": "db9508f7b1474469d9d3c53b86f817e344732678",
"shasum": ""
},
"require": {
@@ -1433,10 +1447,10 @@
"fidry/makefile": "^0.2.0",
"fidry/php-cs-fixer-config": "^1.1.2",
"phpstan/extension-installer": "^1.2.0",
- "phpstan/phpstan": "^1.9.2",
- "phpstan/phpstan-deprecation-rules": "^1.0.0",
- "phpstan/phpstan-phpunit": "^1.2.2",
- "phpstan/phpstan-strict-rules": "^1.4.4",
+ "phpstan/phpstan": "^2.0",
+ "phpstan/phpstan-deprecation-rules": "^2.0.0",
+ "phpstan/phpstan-phpunit": "^2.0",
+ "phpstan/phpstan-strict-rules": "^2.0",
"phpunit/phpunit": "^8.5.31 || ^9.5.26",
"webmozarts/strict-phpunit": "^7.5"
},
@@ -1463,7 +1477,7 @@
],
"support": {
"issues": "https://github.com/theofidry/cpu-core-counter/issues",
- "source": "https://github.com/theofidry/cpu-core-counter/tree/1.2.0"
+ "source": "https://github.com/theofidry/cpu-core-counter/tree/1.3.0"
},
"funding": [
{
@@ -1471,7 +1485,7 @@
"type": "github"
}
],
- "time": "2024-08-06T10:04:20+00:00"
+ "time": "2025-08-14T07:29:31+00:00"
},
{
"name": "kelunik/certificate",
@@ -1758,16 +1772,16 @@
},
{
"name": "nikic/php-parser",
- "version": "v5.5.0",
+ "version": "v5.6.2",
"source": {
"type": "git",
"url": "https://github.com/nikic/PHP-Parser.git",
- "reference": "ae59794362fe85e051a58ad36b289443f57be7a9"
+ "reference": "3a454ca033b9e06b63282ce19562e892747449bb"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/ae59794362fe85e051a58ad36b289443f57be7a9",
- "reference": "ae59794362fe85e051a58ad36b289443f57be7a9",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/3a454ca033b9e06b63282ce19562e892747449bb",
+ "reference": "3a454ca033b9e06b63282ce19562e892747449bb",
"shasum": ""
},
"require": {
@@ -1786,7 +1800,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "5.0-dev"
+ "dev-master": "5.x-dev"
}
},
"autoload": {
@@ -1810,9 +1824,9 @@
],
"support": {
"issues": "https://github.com/nikic/PHP-Parser/issues",
- "source": "https://github.com/nikic/PHP-Parser/tree/v5.5.0"
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.6.2"
},
- "time": "2025-05-31T08:24:38+00:00"
+ "time": "2025-10-21T19:32:17+00:00"
},
{
"name": "pdepend/pdepend",
@@ -1932,16 +1946,16 @@
},
{
"name": "phpdocumentor/reflection-docblock",
- "version": "5.6.2",
+ "version": "5.6.3",
"source": {
"type": "git",
"url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
- "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62"
+ "reference": "94f8051919d1b0369a6bcc7931d679a511c03fe9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/92dde6a5919e34835c506ac8c523ef095a95ed62",
- "reference": "92dde6a5919e34835c506ac8c523ef095a95ed62",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94f8051919d1b0369a6bcc7931d679a511c03fe9",
+ "reference": "94f8051919d1b0369a6bcc7931d679a511c03fe9",
"shasum": ""
},
"require": {
@@ -1990,9 +2004,9 @@
"description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
"support": {
"issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues",
- "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.2"
+ "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.6.3"
},
- "time": "2025-04-13T19:20:35+00:00"
+ "time": "2025-08-01T19:43:32+00:00"
},
{
"name": "phpdocumentor/type-resolver",
@@ -2137,16 +2151,16 @@
},
{
"name": "phpstan/phpdoc-parser",
- "version": "2.1.0",
+ "version": "2.3.0",
"source": {
"type": "git",
"url": "https://github.com/phpstan/phpdoc-parser.git",
- "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68"
+ "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/9b30d6fd026b2c132b3985ce6b23bec09ab3aa68",
- "reference": "9b30d6fd026b2c132b3985ce6b23bec09ab3aa68",
+ "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/1e0cd5370df5dd2e556a36b9c62f62e555870495",
+ "reference": "1e0cd5370df5dd2e556a36b9c62f62e555870495",
"shasum": ""
},
"require": {
@@ -2178,22 +2192,17 @@
"description": "PHPDoc parser with support for nullable, intersection and generic types",
"support": {
"issues": "https://github.com/phpstan/phpdoc-parser/issues",
- "source": "https://github.com/phpstan/phpdoc-parser/tree/2.1.0"
+ "source": "https://github.com/phpstan/phpdoc-parser/tree/2.3.0"
},
- "time": "2025-02-19T13:28:12+00:00"
+ "time": "2025-08-30T15:50:23+00:00"
},
{
"name": "phpstan/phpstan",
- "version": "2.1.17",
- "source": {
- "type": "git",
- "url": "https://github.com/phpstan/phpstan.git",
- "reference": "89b5ef665716fa2a52ecd2633f21007a6a349053"
- },
+ "version": "2.1.31",
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/phpstan/phpstan/zipball/89b5ef665716fa2a52ecd2633f21007a6a349053",
- "reference": "89b5ef665716fa2a52ecd2633f21007a6a349053",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/ead89849d879fe203ce9292c6ef5e7e76f867b96",
+ "reference": "ead89849d879fe203ce9292c6ef5e7e76f867b96",
"shasum": ""
},
"require": {
@@ -2238,7 +2247,7 @@
"type": "github"
}
],
- "time": "2025-05-21T20:55:28+00:00"
+ "time": "2025-10-10T14:14:11+00:00"
},
{
"name": "psr/container",
@@ -2453,21 +2462,21 @@
},
{
"name": "rector/rector",
- "version": "2.0.18",
+ "version": "2.2.7",
"source": {
"type": "git",
"url": "https://github.com/rectorphp/rector.git",
- "reference": "be3a452085b524a04056e3dfe72d861948711062"
+ "reference": "022038537838bc8a4e526af86c2d6e38eaeff7ef"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/rectorphp/rector/zipball/be3a452085b524a04056e3dfe72d861948711062",
- "reference": "be3a452085b524a04056e3dfe72d861948711062",
+ "url": "https://api.github.com/repos/rectorphp/rector/zipball/022038537838bc8a4e526af86c2d6e38eaeff7ef",
+ "reference": "022038537838bc8a4e526af86c2d6e38eaeff7ef",
"shasum": ""
},
"require": {
"php": "^7.4|^8.0",
- "phpstan/phpstan": "^2.1.17"
+ "phpstan/phpstan": "^2.1.26"
},
"conflict": {
"rector/rector-doctrine": "*",
@@ -2492,6 +2501,7 @@
"MIT"
],
"description": "Instant Upgrade and Automated Refactoring of any PHP code",
+ "homepage": "https://getrector.com/",
"keywords": [
"automation",
"dev",
@@ -2500,7 +2510,7 @@
],
"support": {
"issues": "https://github.com/rectorphp/rector/issues",
- "source": "https://github.com/rectorphp/rector/tree/2.0.18"
+ "source": "https://github.com/rectorphp/rector/tree/2.2.7"
},
"funding": [
{
@@ -2508,20 +2518,20 @@
"type": "github"
}
],
- "time": "2025-06-11T11:19:37+00:00"
+ "time": "2025-10-29T15:46:12+00:00"
},
{
"name": "rector/swiss-knife",
- "version": "2.3.0",
+ "version": "2.3.3",
"source": {
"type": "git",
"url": "https://github.com/rectorphp/swiss-knife.git",
- "reference": "d681109ef62d0657cca6610fdf4488837e5e9522"
+ "reference": "4e19741422511b7b26d64dcf272fab6dc155f873"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/rectorphp/swiss-knife/zipball/d681109ef62d0657cca6610fdf4488837e5e9522",
- "reference": "d681109ef62d0657cca6610fdf4488837e5e9522",
+ "url": "https://api.github.com/repos/rectorphp/swiss-knife/zipball/4e19741422511b7b26d64dcf272fab6dc155f873",
+ "reference": "4e19741422511b7b26d64dcf272fab6dc155f873",
"shasum": ""
},
"require": {
@@ -2543,7 +2553,7 @@
"description": "Swiss knife in pocket of every upgrade architect",
"support": {
"issues": "https://github.com/rectorphp/swiss-knife/issues",
- "source": "https://github.com/rectorphp/swiss-knife/tree/2.3.0"
+ "source": "https://github.com/rectorphp/swiss-knife/tree/2.3.3"
},
"funding": [
{
@@ -2555,7 +2565,7 @@
"type": "github"
}
],
- "time": "2025-06-16T07:59:07+00:00"
+ "time": "2025-08-15T14:49:18+00:00"
},
{
"name": "revolt/event-loop",
@@ -2698,32 +2708,32 @@
},
{
"name": "slevomat/coding-standard",
- "version": "8.19.1",
+ "version": "8.22.1",
"source": {
"type": "git",
"url": "https://github.com/slevomat/coding-standard.git",
- "reference": "458d665acd49009efebd7e0cb385d71ae9ac3220"
+ "reference": "1dd80bf3b93692bedb21a6623c496887fad05fec"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/458d665acd49009efebd7e0cb385d71ae9ac3220",
- "reference": "458d665acd49009efebd7e0cb385d71ae9ac3220",
+ "url": "https://api.github.com/repos/slevomat/coding-standard/zipball/1dd80bf3b93692bedb21a6623c496887fad05fec",
+ "reference": "1dd80bf3b93692bedb21a6623c496887fad05fec",
"shasum": ""
},
"require": {
- "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.0",
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.6.2 || ^0.7 || ^1.1.2",
"php": "^7.4 || ^8.0",
- "phpstan/phpdoc-parser": "^2.1.0",
- "squizlabs/php_codesniffer": "^3.13.0"
+ "phpstan/phpdoc-parser": "^2.3.0",
+ "squizlabs/php_codesniffer": "^3.13.4"
},
"require-dev": {
- "phing/phing": "3.0.1",
+ "phing/phing": "3.0.1|3.1.0",
"php-parallel-lint/php-parallel-lint": "1.4.0",
- "phpstan/phpstan": "2.1.17",
+ "phpstan/phpstan": "2.1.24",
"phpstan/phpstan-deprecation-rules": "2.0.3",
- "phpstan/phpstan-phpunit": "2.0.6",
- "phpstan/phpstan-strict-rules": "2.0.4",
- "phpunit/phpunit": "9.6.8|10.5.45|11.4.4|11.5.21|12.1.3"
+ "phpstan/phpstan-phpunit": "2.0.7",
+ "phpstan/phpstan-strict-rules": "2.0.6",
+ "phpunit/phpunit": "9.6.8|10.5.48|11.4.4|11.5.36|12.3.10"
},
"type": "phpcodesniffer-standard",
"extra": {
@@ -2747,7 +2757,7 @@
],
"support": {
"issues": "https://github.com/slevomat/coding-standard/issues",
- "source": "https://github.com/slevomat/coding-standard/tree/8.19.1"
+ "source": "https://github.com/slevomat/coding-standard/tree/8.22.1"
},
"funding": [
{
@@ -2759,7 +2769,7 @@
"type": "tidelift"
}
],
- "time": "2025-06-09T17:53:57+00:00"
+ "time": "2025-09-13T08:53:30+00:00"
},
{
"name": "spatie/array-to-xml",
@@ -2831,16 +2841,16 @@
},
{
"name": "squizlabs/php_codesniffer",
- "version": "3.13.2",
+ "version": "3.13.5",
"source": {
"type": "git",
"url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git",
- "reference": "5b5e3821314f947dd040c70f7992a64eac89025c"
+ "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/5b5e3821314f947dd040c70f7992a64eac89025c",
- "reference": "5b5e3821314f947dd040c70f7992a64eac89025c",
+ "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0ca86845ce43291e8f5692c7356fccf3bcf02bf4",
+ "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4",
"shasum": ""
},
"require": {
@@ -2857,11 +2867,6 @@
"bin/phpcs"
],
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.x-dev"
- }
- },
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
@@ -2911,20 +2916,20 @@
"type": "thanks_dev"
}
],
- "time": "2025-06-17T22:17:01+00:00"
+ "time": "2025-11-04T16:30:35+00:00"
},
{
"name": "symfony/config",
- "version": "v7.3.0",
+ "version": "v7.3.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/config.git",
- "reference": "ba62ae565f1327c2f6366726312ed828c85853bc"
+ "reference": "9d18eba95655a3152ae4c1d53c6cc34eb4d4a0b7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/config/zipball/ba62ae565f1327c2f6366726312ed828c85853bc",
- "reference": "ba62ae565f1327c2f6366726312ed828c85853bc",
+ "url": "https://api.github.com/repos/symfony/config/zipball/9d18eba95655a3152ae4c1d53c6cc34eb4d4a0b7",
+ "reference": "9d18eba95655a3152ae4c1d53c6cc34eb4d4a0b7",
"shasum": ""
},
"require": {
@@ -2970,7 +2975,7 @@
"description": "Helps you find, load, combine, autofill and validate configuration values of any kind",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/config/tree/v7.3.0"
+ "source": "https://github.com/symfony/config/tree/v7.3.6"
},
"funding": [
{
@@ -2981,25 +2986,29 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2025-05-15T09:04:05+00:00"
+ "time": "2025-11-02T08:04:43+00:00"
},
{
"name": "symfony/console",
- "version": "v7.3.0",
+ "version": "v7.3.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/console.git",
- "reference": "66c1440edf6f339fd82ed6c7caa76cb006211b44"
+ "reference": "c28ad91448f86c5f6d9d2c70f0cf68bf135f252a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/console/zipball/66c1440edf6f339fd82ed6c7caa76cb006211b44",
- "reference": "66c1440edf6f339fd82ed6c7caa76cb006211b44",
+ "url": "https://api.github.com/repos/symfony/console/zipball/c28ad91448f86c5f6d9d2c70f0cf68bf135f252a",
+ "reference": "c28ad91448f86c5f6d9d2c70f0cf68bf135f252a",
"shasum": ""
},
"require": {
@@ -3064,7 +3073,7 @@
"terminal"
],
"support": {
- "source": "https://github.com/symfony/console/tree/v7.3.0"
+ "source": "https://github.com/symfony/console/tree/v7.3.6"
},
"funding": [
{
@@ -3075,25 +3084,29 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2025-05-24T10:34:04+00:00"
+ "time": "2025-11-04T01:21:42+00:00"
},
{
"name": "symfony/dependency-injection",
- "version": "v7.3.0",
+ "version": "v7.3.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/dependency-injection.git",
- "reference": "f64a8f3fa7d4ad5e85de1b128a0e03faed02b732"
+ "reference": "98af8bb46c56aedd9dd5a7f0414fc72bf2dcfe69"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/f64a8f3fa7d4ad5e85de1b128a0e03faed02b732",
- "reference": "f64a8f3fa7d4ad5e85de1b128a0e03faed02b732",
+ "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/98af8bb46c56aedd9dd5a7f0414fc72bf2dcfe69",
+ "reference": "98af8bb46c56aedd9dd5a7f0414fc72bf2dcfe69",
"shasum": ""
},
"require": {
@@ -3144,7 +3157,7 @@
"description": "Allows you to standardize and centralize the way objects are constructed in your application",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/dependency-injection/tree/v7.3.0"
+ "source": "https://github.com/symfony/dependency-injection/tree/v7.3.6"
},
"funding": [
{
@@ -3155,12 +3168,16 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2025-05-19T13:28:56+00:00"
+ "time": "2025-10-31T10:11:11+00:00"
},
{
"name": "symfony/deprecation-contracts",
@@ -3231,16 +3248,16 @@
},
{
"name": "symfony/filesystem",
- "version": "v7.3.0",
+ "version": "v7.3.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
- "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb"
+ "reference": "e9bcfd7837928ab656276fe00464092cc9e1826a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/filesystem/zipball/b8dce482de9d7c9fe2891155035a7248ab5c7fdb",
- "reference": "b8dce482de9d7c9fe2891155035a7248ab5c7fdb",
+ "url": "https://api.github.com/repos/symfony/filesystem/zipball/e9bcfd7837928ab656276fe00464092cc9e1826a",
+ "reference": "e9bcfd7837928ab656276fe00464092cc9e1826a",
"shasum": ""
},
"require": {
@@ -3277,7 +3294,7 @@
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
- "source": "https://github.com/symfony/filesystem/tree/v7.3.0"
+ "source": "https://github.com/symfony/filesystem/tree/v7.3.6"
},
"funding": [
{
@@ -3288,16 +3305,20 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2024-10-25T15:15:23+00:00"
+ "time": "2025-11-05T09:52:27+00:00"
},
{
"name": "symfony/polyfill-ctype",
- "version": "v1.32.0",
+ "version": "v1.33.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-ctype.git",
@@ -3356,7 +3377,7 @@
"portable"
],
"support": {
- "source": "https://github.com/symfony/polyfill-ctype/tree/v1.32.0"
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.33.0"
},
"funding": [
{
@@ -3367,6 +3388,10 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
@@ -3376,16 +3401,16 @@
},
{
"name": "symfony/polyfill-intl-grapheme",
- "version": "v1.32.0",
+ "version": "v1.33.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-grapheme.git",
- "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe"
+ "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
- "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe",
+ "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/380872130d3a5dd3ace2f4010d95125fde5d5c70",
+ "reference": "380872130d3a5dd3ace2f4010d95125fde5d5c70",
"shasum": ""
},
"require": {
@@ -3434,7 +3459,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.32.0"
+ "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.33.0"
},
"funding": [
{
@@ -3445,16 +3470,20 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2024-09-09T11:45:10+00:00"
+ "time": "2025-06-27T09:58:17+00:00"
},
{
"name": "symfony/polyfill-intl-normalizer",
- "version": "v1.32.0",
+ "version": "v1.33.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-intl-normalizer.git",
@@ -3515,7 +3544,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.32.0"
+ "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.33.0"
},
"funding": [
{
@@ -3526,6 +3555,10 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
@@ -3535,7 +3568,7 @@
},
{
"name": "symfony/polyfill-mbstring",
- "version": "v1.32.0",
+ "version": "v1.33.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
@@ -3596,7 +3629,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.32.0"
+ "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.33.0"
},
"funding": [
{
@@ -3607,6 +3640,10 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
@@ -3616,16 +3653,16 @@
},
{
"name": "symfony/polyfill-php84",
- "version": "v1.32.0",
+ "version": "v1.33.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-php84.git",
- "reference": "000df7860439609837bbe28670b0be15783b7fbf"
+ "reference": "d8ced4d875142b6a7426000426b8abc631d6b191"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/000df7860439609837bbe28670b0be15783b7fbf",
- "reference": "000df7860439609837bbe28670b0be15783b7fbf",
+ "url": "https://api.github.com/repos/symfony/polyfill-php84/zipball/d8ced4d875142b6a7426000426b8abc631d6b191",
+ "reference": "d8ced4d875142b6a7426000426b8abc631d6b191",
"shasum": ""
},
"require": {
@@ -3672,7 +3709,7 @@
"shim"
],
"support": {
- "source": "https://github.com/symfony/polyfill-php84/tree/v1.32.0"
+ "source": "https://github.com/symfony/polyfill-php84/tree/v1.33.0"
},
"funding": [
{
@@ -3683,25 +3720,29 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2025-02-20T12:04:08+00:00"
+ "time": "2025-06-24T13:30:11+00:00"
},
{
"name": "symfony/service-contracts",
- "version": "v3.6.0",
+ "version": "v3.6.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/service-contracts.git",
- "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4"
+ "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4",
- "reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4",
+ "url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43",
+ "reference": "45112560a3ba2d715666a509a0bc9521d10b6c43",
"shasum": ""
},
"require": {
@@ -3755,7 +3796,7 @@
"standards"
],
"support": {
- "source": "https://github.com/symfony/service-contracts/tree/v3.6.0"
+ "source": "https://github.com/symfony/service-contracts/tree/v3.6.1"
},
"funding": [
{
@@ -3766,25 +3807,29 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2025-04-25T09:37:31+00:00"
+ "time": "2025-07-15T11:30:57+00:00"
},
{
"name": "symfony/string",
- "version": "v7.3.0",
+ "version": "v7.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/string.git",
- "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125"
+ "reference": "f96476035142921000338bad71e5247fbc138872"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/string/zipball/f3570b8c61ca887a9e2938e85cb6458515d2b125",
- "reference": "f3570b8c61ca887a9e2938e85cb6458515d2b125",
+ "url": "https://api.github.com/repos/symfony/string/zipball/f96476035142921000338bad71e5247fbc138872",
+ "reference": "f96476035142921000338bad71e5247fbc138872",
"shasum": ""
},
"require": {
@@ -3799,7 +3844,6 @@
},
"require-dev": {
"symfony/emoji": "^7.1",
- "symfony/error-handler": "^6.4|^7.0",
"symfony/http-client": "^6.4|^7.0",
"symfony/intl": "^6.4|^7.0",
"symfony/translation-contracts": "^2.5|^3.0",
@@ -3842,7 +3886,7 @@
"utf8"
],
"support": {
- "source": "https://github.com/symfony/string/tree/v7.3.0"
+ "source": "https://github.com/symfony/string/tree/v7.3.4"
},
"funding": [
{
@@ -3853,25 +3897,29 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2025-04-20T20:19:01+00:00"
+ "time": "2025-09-11T14:36:48+00:00"
},
{
"name": "symfony/var-exporter",
- "version": "v7.3.0",
+ "version": "v7.3.4",
"source": {
"type": "git",
"url": "https://github.com/symfony/var-exporter.git",
- "reference": "c9a1168891b5aaadfd6332ef44393330b3498c4c"
+ "reference": "0f020b544a30a7fe8ba972e53ee48a74c0bc87f4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/symfony/var-exporter/zipball/c9a1168891b5aaadfd6332ef44393330b3498c4c",
- "reference": "c9a1168891b5aaadfd6332ef44393330b3498c4c",
+ "url": "https://api.github.com/repos/symfony/var-exporter/zipball/0f020b544a30a7fe8ba972e53ee48a74c0bc87f4",
+ "reference": "0f020b544a30a7fe8ba972e53ee48a74c0bc87f4",
"shasum": ""
},
"require": {
@@ -3919,7 +3967,7 @@
"serialize"
],
"support": {
- "source": "https://github.com/symfony/var-exporter/tree/v7.3.0"
+ "source": "https://github.com/symfony/var-exporter/tree/v7.3.4"
},
"funding": [
{
@@ -3930,25 +3978,29 @@
"url": "https://github.com/fabpot",
"type": "github"
},
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
- "time": "2025-05-15T09:04:05+00:00"
+ "time": "2025-09-11T10:12:26+00:00"
},
{
"name": "vimeo/psalm",
- "version": "6.12.0",
+ "version": "6.13.1",
"source": {
"type": "git",
"url": "https://github.com/vimeo/psalm.git",
- "reference": "cf420941d061a57050b6c468ef2c778faf40aee2"
+ "reference": "1e3b7f0a8ab32b23197b91107adc0a7ed8a05b51"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/vimeo/psalm/zipball/cf420941d061a57050b6c468ef2c778faf40aee2",
- "reference": "cf420941d061a57050b6c468ef2c778faf40aee2",
+ "url": "https://api.github.com/repos/vimeo/psalm/zipball/1e3b7f0a8ab32b23197b91107adc0a7ed8a05b51",
+ "reference": "1e3b7f0a8ab32b23197b91107adc0a7ed8a05b51",
"shasum": ""
},
"require": {
@@ -4053,32 +4105,32 @@
"issues": "https://github.com/vimeo/psalm/issues",
"source": "https://github.com/vimeo/psalm"
},
- "time": "2025-05-28T12:52:06+00:00"
+ "time": "2025-08-06T10:10:28+00:00"
},
{
"name": "webmozart/assert",
- "version": "1.11.0",
+ "version": "1.12.1",
"source": {
"type": "git",
"url": "https://github.com/webmozarts/assert.git",
- "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991"
+ "reference": "9be6926d8b485f55b9229203f962b51ed377ba68"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991",
- "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991",
+ "url": "https://api.github.com/repos/webmozarts/assert/zipball/9be6926d8b485f55b9229203f962b51ed377ba68",
+ "reference": "9be6926d8b485f55b9229203f962b51ed377ba68",
"shasum": ""
},
"require": {
"ext-ctype": "*",
+ "ext-date": "*",
+ "ext-filter": "*",
"php": "^7.2 || ^8.0"
},
- "conflict": {
- "phpstan/phpstan": "<0.12.20",
- "vimeo/psalm": "<4.6.1 || 4.6.2"
- },
- "require-dev": {
- "phpunit/phpunit": "^8.5.13"
+ "suggest": {
+ "ext-intl": "",
+ "ext-simplexml": "",
+ "ext-spl": ""
},
"type": "library",
"extra": {
@@ -4109,9 +4161,9 @@
],
"support": {
"issues": "https://github.com/webmozarts/assert/issues",
- "source": "https://github.com/webmozarts/assert/tree/1.11.0"
+ "source": "https://github.com/webmozarts/assert/tree/1.12.1"
},
- "time": "2022-06-03T18:03:27+00:00"
+ "time": "2025-10-29T15:56:20+00:00"
}
],
"aliases": [],
@@ -4121,5 +4173,8 @@
"prefer-lowest": false,
"platform": {},
"platform-dev": {},
+ "platform-overrides": {
+ "php": "8.4.99"
+ },
"plugin-api-version": "2.6.0"
}