From 51868441ba77481b68a3300b1e19d34cc22e3cc3 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sat, 8 Aug 2026 08:20:34 +0300 Subject: [PATCH 1/4] Add Composer Dependency Analyser --- ...e-checker.yml => composer-dependency-analyser.yml} | 11 +++++------ composer-dependency-analyser.php | 11 +++++++++++ composer.json | 3 ++- docs/internals.md | 6 +++--- 4 files changed, 21 insertions(+), 10 deletions(-) rename .github/workflows/{composer-require-checker.yml => composer-dependency-analyser.yml} (57%) create mode 100644 composer-dependency-analyser.php diff --git a/.github/workflows/composer-require-checker.yml b/.github/workflows/composer-dependency-analyser.yml similarity index 57% rename from .github/workflows/composer-require-checker.yml rename to .github/workflows/composer-dependency-analyser.yml index 99be65f..3fed6a3 100644 --- a/.github/workflows/composer-require-checker.yml +++ b/.github/workflows/composer-dependency-analyser.yml @@ -1,12 +1,13 @@ -name: Composer require checker +name: composer dependency analyser on: pull_request: paths: &paths - 'src/**' - 'tests/**' + - '.github/workflows/composer-dependency-analyser.yml' - 'composer.json' - - '.github/workflows/composer-require-checker.yml' + - 'composer-dependency-analyser.php' push: branches: ['master'] paths: *paths @@ -19,10 +20,8 @@ concurrency: cancel-in-progress: true jobs: - composer-require-checker: - uses: yiisoft/actions/.github/workflows/composer-require-checker.yml@master + composer-dependency-analyser: + uses: yiisoft/actions/.github/workflows/composer-dependency-analyser.yml@master with: - os: >- - ['ubuntu-latest'] php: >- ['8.1', '8.2', '8.3', '8.4', '8.5'] diff --git a/composer-dependency-analyser.php b/composer-dependency-analyser.php new file mode 100644 index 0000000..5b4c026 --- /dev/null +++ b/composer-dependency-analyser.php @@ -0,0 +1,11 @@ +disableComposerAutoloadPathScan() + ->setFileExtensions(['php']) + ->addPathToScan(__DIR__ . '/src', isDev: false) + ->addPathToScan(__DIR__ . '/tests', isDev: true); diff --git a/composer.json b/composer.json index 39bd9c7..a3e6000 100644 --- a/composer.json +++ b/composer.json @@ -38,10 +38,10 @@ }, "require-dev": { "friendsofphp/php-cs-fixer": "^3.92.5", - "maglnet/composer-require-checker": "^4.7", "phpunit/phpunit": "^10.5", "rector/rector": "^2.1.5", "roave/infection-static-analysis-plugin": "^1.35", + "shipmonk/composer-dependency-analyser": "^1.8", "spatie/phpunit-watcher": "^1.24", "vimeo/psalm": "^5.26.1 || ^6.14.1", "vlucas/phpdotenv": "^5.6" @@ -68,6 +68,7 @@ } }, "scripts": { + "dependency-analyser": "composer-dependency-analyser", "test": "phpunit --testdox --no-interaction", "test-watch": "phpunit-watcher watch" } diff --git a/docs/internals.md b/docs/internals.md index 1450122..b77907c 100644 --- a/docs/internals.md +++ b/docs/internals.md @@ -36,9 +36,9 @@ use either newest or any specific version of PHP: ## Dependencies -This package uses [composer-require-checker](https://github.com/maglnet/ComposerRequireChecker) to check if all -dependencies are correctly defined in `composer.json`. To run the checker, execute the following command: +Use [Composer Dependency Analyser](https://github.com/shipmonk-rnd/composer-dependency-analyser) to detect unknown, +shadow, and unused [Composer](https://getcomposer.org) dependencies: ```shell -./vendor/bin/composer-require-checker +./vendor/bin/composer-dependency-analyser ``` From 0abb71e95782c28bac07b46cc33291f0de841abf Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sat, 8 Aug 2026 19:38:21 +0300 Subject: [PATCH 2/4] fix --- CHANGELOG.md | 1 + composer.json | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4d28a99..acfdaa4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## 1.0.1 under development - Enh #50: Explicitly import classes, functions, and constants in "use" section (@mspirkov) +- Enh #68: Remove unused `ext-mbstring` dependency (@vjik) ## 1.0.0 December 21, 2025 diff --git a/composer.json b/composer.json index a3e6000..f33ca07 100644 --- a/composer.json +++ b/composer.json @@ -31,7 +31,6 @@ ], "require": { "php": "8.1 - 8.5", - "ext-mbstring": "*", "cycle/database": "^2.11", "cycle/orm": "^2.9", "yiisoft/data": "^2.0" From 78a90c8a7a58163d54099f6bf18ee036701ce5ba Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sat, 8 Aug 2026 19:42:48 +0300 Subject: [PATCH 3/4] Remove `#[Override]` attributes usage --- CHANGELOG.md | 1 + src/Reader/EntityReader.php | 13 ------------- src/Reader/FilterHandler/AllHandler.php | 3 --- src/Reader/FilterHandler/AndXHandler.php | 3 --- src/Reader/FilterHandler/BetweenHandler.php | 3 --- src/Reader/FilterHandler/EqualsHandler.php | 3 --- src/Reader/FilterHandler/EqualsNullHandler.php | 3 --- src/Reader/FilterHandler/GreaterThanHandler.php | 3 --- .../FilterHandler/GreaterThanOrEqualHandler.php | 3 --- src/Reader/FilterHandler/InHandler.php | 3 --- src/Reader/FilterHandler/LessThanHandler.php | 3 --- src/Reader/FilterHandler/LessThanOrEqualHandler.php | 3 --- .../FilterHandler/LikeHandler/BaseLikeHandler.php | 2 -- .../FilterHandler/LikeHandler/MysqlLikeHandler.php | 2 -- .../LikeHandler/PostgresLikeHandler.php | 2 -- .../LikeHandler/SqlServerLikeHandler.php | 2 -- .../FilterHandler/LikeHandler/SqliteLikeHandler.php | 2 -- src/Reader/FilterHandler/NoneHandler.php | 3 --- src/Reader/FilterHandler/NotHandler.php | 3 --- src/Reader/FilterHandler/OrXHandler.php | 3 --- src/Writer/EntityWriter.php | 3 --- 21 files changed, 1 insertion(+), 65 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index acfdaa4..b2bb905 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ - Enh #50: Explicitly import classes, functions, and constants in "use" section (@mspirkov) - Enh #68: Remove unused `ext-mbstring` dependency (@vjik) +- Enh #68: Remove `#[Override]` attributes usage (@vjik) ## 1.0.0 December 21, 2025 diff --git a/src/Reader/EntityReader.php b/src/Reader/EntityReader.php index 8d3d34e..63255ef 100644 --- a/src/Reader/EntityReader.php +++ b/src/Reader/EntityReader.php @@ -18,7 +18,6 @@ use Yiisoft\Data\Reader\Sort; use Yiisoft\Data\Cycle\Reader\Cache\CachedCollection; use Yiisoft\Data\Cycle\Reader\Cache\CachedCount; -use Override; use function array_key_exists; use function is_int; @@ -84,7 +83,6 @@ public function __construct(Select|SelectQuery $query, array $extraFilterHandler $this->filter = new All(); } - #[Override] public function getSort(): ?Sort { return $this->sorting; @@ -93,7 +91,6 @@ public function getSort(): ?Sort /** * @psalm-mutation-free */ - #[Override] public function withLimit(?int $limit): static { /** @psalm-suppress DocblockTypeContradiction */ @@ -111,7 +108,6 @@ public function withLimit(?int $limit): static /** * @psalm-mutation-free */ - #[Override] public function withOffset(int $offset): static { $new = clone $this; @@ -125,7 +121,6 @@ public function withOffset(int $offset): static /** * @psalm-mutation-free */ - #[Override] public function withSort(?Sort $sort): static { $new = clone $this; @@ -140,7 +135,6 @@ public function withSort(?Sort $sort): static /** * @psalm-mutation-free */ - #[Override] public function withFilter(FilterInterface $filter): static { $new = clone $this; @@ -154,13 +148,11 @@ public function withFilter(FilterInterface $filter): static return $new; } - #[Override] public function count(): int { return $this->countCache->getCount(); } - #[Override] public function read(): iterable { if ($this->itemsCache->getCollection() === null) { @@ -170,7 +162,6 @@ public function read(): iterable return $this->itemsCache->getCollection(); } - #[Override] public function readOne(): array|object|null { if (!$this->oneItemCache->isCollected()) { @@ -188,7 +179,6 @@ public function readOne(): array|object|null /** * Get Iterator without caching */ - #[Override] public function getIterator(): Generator { yield from $this->itemsCache->getCollection() ?? $this->buildSelectQuery()->getIterator(); @@ -200,19 +190,16 @@ public function getSql(): string return (string) ($query instanceof Select ? $query->buildQuery() : $query); } - #[Override] public function getFilter(): FilterInterface { return $this->filter; } - #[Override] public function getLimit(): ?int { return $this->limit; } - #[Override] public function getOffset(): int { return $this->offset; diff --git a/src/Reader/FilterHandler/AllHandler.php b/src/Reader/FilterHandler/AllHandler.php index e7b24c4..58cebc2 100644 --- a/src/Reader/FilterHandler/AllHandler.php +++ b/src/Reader/FilterHandler/AllHandler.php @@ -10,17 +10,14 @@ use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\All; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class AllHandler implements QueryBuilderFilterHandler { - #[Override] public function getFilterClass(): string { return All::class; } - #[Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var All $filter */ diff --git a/src/Reader/FilterHandler/AndXHandler.php b/src/Reader/FilterHandler/AndXHandler.php index 6dfcbfe..a70ff75 100644 --- a/src/Reader/FilterHandler/AndXHandler.php +++ b/src/Reader/FilterHandler/AndXHandler.php @@ -10,17 +10,14 @@ use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\AndX; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class AndXHandler implements QueryBuilderFilterHandler { - #[Override] public function getFilterClass(): string { return AndX::class; } - #[Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var AndX $filter */ diff --git a/src/Reader/FilterHandler/BetweenHandler.php b/src/Reader/FilterHandler/BetweenHandler.php index a2361e5..5e7376d 100644 --- a/src/Reader/FilterHandler/BetweenHandler.php +++ b/src/Reader/FilterHandler/BetweenHandler.php @@ -7,17 +7,14 @@ use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\Between; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class BetweenHandler implements QueryBuilderFilterHandler { - #[Override] public function getFilterClass(): string { return Between::class; } - #[Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var Between $filter */ diff --git a/src/Reader/FilterHandler/EqualsHandler.php b/src/Reader/FilterHandler/EqualsHandler.php index 1cc1229..a8166cd 100644 --- a/src/Reader/FilterHandler/EqualsHandler.php +++ b/src/Reader/FilterHandler/EqualsHandler.php @@ -7,17 +7,14 @@ use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\Equals; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class EqualsHandler implements QueryBuilderFilterHandler { - #[Override] public function getFilterClass(): string { return Equals::class; } - #[Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var Equals $filter */ diff --git a/src/Reader/FilterHandler/EqualsNullHandler.php b/src/Reader/FilterHandler/EqualsNullHandler.php index fd9059d..92099c4 100644 --- a/src/Reader/FilterHandler/EqualsNullHandler.php +++ b/src/Reader/FilterHandler/EqualsNullHandler.php @@ -7,17 +7,14 @@ use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\EqualsNull; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class EqualsNullHandler implements QueryBuilderFilterHandler { - #[Override] public function getFilterClass(): string { return EqualsNull::class; } - #[Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var EqualsNull $filter */ diff --git a/src/Reader/FilterHandler/GreaterThanHandler.php b/src/Reader/FilterHandler/GreaterThanHandler.php index 0fc85e4..01b8dc4 100644 --- a/src/Reader/FilterHandler/GreaterThanHandler.php +++ b/src/Reader/FilterHandler/GreaterThanHandler.php @@ -7,17 +7,14 @@ use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\GreaterThan; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class GreaterThanHandler implements QueryBuilderFilterHandler { - #[Override] public function getFilterClass(): string { return GreaterThan::class; } - #[Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var GreaterThan $filter */ diff --git a/src/Reader/FilterHandler/GreaterThanOrEqualHandler.php b/src/Reader/FilterHandler/GreaterThanOrEqualHandler.php index 22abdb6..c8283fe 100644 --- a/src/Reader/FilterHandler/GreaterThanOrEqualHandler.php +++ b/src/Reader/FilterHandler/GreaterThanOrEqualHandler.php @@ -7,17 +7,14 @@ use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\GreaterThanOrEqual; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class GreaterThanOrEqualHandler implements QueryBuilderFilterHandler { - #[Override] public function getFilterClass(): string { return GreaterThanOrEqual::class; } - #[Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var GreaterThanOrEqual $filter */ diff --git a/src/Reader/FilterHandler/InHandler.php b/src/Reader/FilterHandler/InHandler.php index fd521d8..e65e58e 100644 --- a/src/Reader/FilterHandler/InHandler.php +++ b/src/Reader/FilterHandler/InHandler.php @@ -8,17 +8,14 @@ use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\In; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class InHandler implements QueryBuilderFilterHandler { - #[Override] public function getFilterClass(): string { return In::class; } - #[Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var In $filter */ diff --git a/src/Reader/FilterHandler/LessThanHandler.php b/src/Reader/FilterHandler/LessThanHandler.php index 43d8d3c..2900a39 100644 --- a/src/Reader/FilterHandler/LessThanHandler.php +++ b/src/Reader/FilterHandler/LessThanHandler.php @@ -7,17 +7,14 @@ use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\LessThan; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class LessThanHandler implements QueryBuilderFilterHandler { - #[Override] public function getFilterClass(): string { return LessThan::class; } - #[Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var LessThan $filter */ diff --git a/src/Reader/FilterHandler/LessThanOrEqualHandler.php b/src/Reader/FilterHandler/LessThanOrEqualHandler.php index 83ddc85..7aa4a7a 100644 --- a/src/Reader/FilterHandler/LessThanOrEqualHandler.php +++ b/src/Reader/FilterHandler/LessThanOrEqualHandler.php @@ -7,17 +7,14 @@ use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\LessThanOrEqual; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class LessThanOrEqualHandler implements QueryBuilderFilterHandler { - #[Override] public function getFilterClass(): string { return LessThanOrEqual::class; } - #[Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var LessThanOrEqual $filter */ diff --git a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php index 027d416..6a93dce 100644 --- a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php @@ -8,7 +8,6 @@ use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\Like; use Yiisoft\Data\Reader\Filter\LikeMode; -use Override; abstract class BaseLikeHandler implements QueryBuilderFilterHandler { @@ -18,7 +17,6 @@ abstract class BaseLikeHandler implements QueryBuilderFilterHandler '\\' => '\\\\', ]; - #[Override] public function getFilterClass(): string { return Like::class; diff --git a/src/Reader/FilterHandler/LikeHandler/MysqlLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/MysqlLikeHandler.php index 5e5fa2a..b0a7b2a 100644 --- a/src/Reader/FilterHandler/LikeHandler/MysqlLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/MysqlLikeHandler.php @@ -6,11 +6,9 @@ use Yiisoft\Data\Reader\Filter\Like; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class MysqlLikeHandler extends BaseLikeHandler { - #[Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var Like $filter */ diff --git a/src/Reader/FilterHandler/LikeHandler/PostgresLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/PostgresLikeHandler.php index a5a06e6..fb9c53b 100644 --- a/src/Reader/FilterHandler/LikeHandler/PostgresLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/PostgresLikeHandler.php @@ -6,11 +6,9 @@ use Yiisoft\Data\Reader\Filter\Like; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class PostgresLikeHandler extends BaseLikeHandler { - #[Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var Like $filter */ diff --git a/src/Reader/FilterHandler/LikeHandler/SqlServerLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/SqlServerLikeHandler.php index ff875c7..163b351 100644 --- a/src/Reader/FilterHandler/LikeHandler/SqlServerLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/SqlServerLikeHandler.php @@ -7,7 +7,6 @@ use Yiisoft\Data\Cycle\Exception\NotSupportedFilterOptionException; use Yiisoft\Data\Reader\Filter\Like; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class SqlServerLikeHandler extends BaseLikeHandler { @@ -16,7 +15,6 @@ public function __construct() unset($this->escapingReplacements['\\']); } - #[Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var Like $filter */ diff --git a/src/Reader/FilterHandler/LikeHandler/SqliteLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/SqliteLikeHandler.php index 3786d96..ce6e19b 100644 --- a/src/Reader/FilterHandler/LikeHandler/SqliteLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/SqliteLikeHandler.php @@ -7,7 +7,6 @@ use Yiisoft\Data\Cycle\Exception\NotSupportedFilterOptionException; use Yiisoft\Data\Reader\Filter\Like; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class SqliteLikeHandler extends BaseLikeHandler { @@ -16,7 +15,6 @@ public function __construct() unset($this->escapingReplacements['\\']); } - #[Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var Like $filter */ diff --git a/src/Reader/FilterHandler/NoneHandler.php b/src/Reader/FilterHandler/NoneHandler.php index d6f0bfe..b427933 100644 --- a/src/Reader/FilterHandler/NoneHandler.php +++ b/src/Reader/FilterHandler/NoneHandler.php @@ -10,17 +10,14 @@ use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\None; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class NoneHandler implements QueryBuilderFilterHandler { - #[Override] public function getFilterClass(): string { return None::class; } - #[Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var None $filter */ diff --git a/src/Reader/FilterHandler/NotHandler.php b/src/Reader/FilterHandler/NotHandler.php index 37ce2ee..1d551f9 100644 --- a/src/Reader/FilterHandler/NotHandler.php +++ b/src/Reader/FilterHandler/NotHandler.php @@ -19,17 +19,14 @@ use Yiisoft\Data\Reader\Filter\Not; use Yiisoft\Data\Reader\Filter\OrX; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class NotHandler implements QueryBuilderFilterHandler { - #[Override] public function getFilterClass(): string { return Not::class; } - #[Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var Not $filter */ diff --git a/src/Reader/FilterHandler/OrXHandler.php b/src/Reader/FilterHandler/OrXHandler.php index e79da00..275aed3 100644 --- a/src/Reader/FilterHandler/OrXHandler.php +++ b/src/Reader/FilterHandler/OrXHandler.php @@ -10,17 +10,14 @@ use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\OrX; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class OrXHandler implements QueryBuilderFilterHandler { - #[Override] public function getFilterClass(): string { return OrX::class; } - #[Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var OrX $filter */ diff --git a/src/Writer/EntityWriter.php b/src/Writer/EntityWriter.php index d6bc72e..b609902 100644 --- a/src/Writer/EntityWriter.php +++ b/src/Writer/EntityWriter.php @@ -7,7 +7,6 @@ use Cycle\ORM\EntityManagerInterface; use Throwable; use Yiisoft\Data\Writer\DataWriterInterface; -use Override; final class EntityWriter implements DataWriterInterface { @@ -16,7 +15,6 @@ public function __construct(private EntityManagerInterface $entityManager) {} /** * @throws Throwable */ - #[Override] public function write(iterable $items): void { foreach ($items as $entity) { @@ -25,7 +23,6 @@ public function write(iterable $items): void $this->entityManager->run(); } - #[Override] public function delete(iterable $items): void { foreach ($items as $entity) { From f271ce47e4c71a6e669971112e0d2e23a50ff267 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sat, 8 Aug 2026 19:44:34 +0300 Subject: [PATCH 4/4] fix --- psalm.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/psalm.xml b/psalm.xml index 2a2f7e5..9135df7 100644 --- a/psalm.xml +++ b/psalm.xml @@ -3,6 +3,7 @@ errorLevel="2" findUnusedBaselineEntry="true" findUnusedCode="false" + ensureOverrideAttribute="false" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://getpsalm.org/schema/config" xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"