From 1b664924d55fd8e81cdea903b630048230946ca2 Mon Sep 17 00:00:00 2001 From: Ross Addison Date: Wed, 21 Jan 2026 12:43:45 +0000 Subject: [PATCH 01/17] Workflow Action Test 1 --- .github/workflows/mssql.yml | 47 +++----- docs/guide/en/PHP-8.5-MSSQL.md | 204 +++++++++++++++++++++++++++++++++ docs/guide/ru/PHP-8.5-MSSQL.md | 193 +++++++++++++++++++++++++++++++ 3 files changed, 411 insertions(+), 33 deletions(-) create mode 100644 docs/guide/en/PHP-8.5-MSSQL.md create mode 100644 docs/guide/ru/PHP-8.5-MSSQL.md diff --git a/.github/workflows/mssql.yml b/.github/workflows/mssql.yml index 462abb1..9d94bed 100644 --- a/.github/workflows/mssql.yml +++ b/.github/workflows/mssql.yml @@ -6,7 +6,6 @@ on: - '.github/workflows/mssql.yml' - 'composer.json' - 'phpunit.xml.dist' - push: branches: ['master'] paths: @@ -15,43 +14,34 @@ on: - '.github/workflows/mssql.yml' - 'composer.json' - 'phpunit.xml.dist' - name: mssql - jobs: tests: + permissions: + contents: read + pull-requests: write name: PHP ${{ matrix.php }}-mssql-${{ matrix.mssql.server }} - env: extensions: pdo, pdo_sqlsrv-5.12 - runs-on: ${{ matrix.mssql.os || 'ubuntu-latest' }} - strategy: matrix: php: - 8.1 - 8.2 - 8.3 - - 8.4 - - 8.5 - + - 8.4 + # - 8.5 # Wait for pdo_sqlsrv 5.13+ or equivalent mssql: + - server: 2017-latest + odbc-version: 17 + flag: "" + - server: 2019-latest + odbc-version: 18 + flag: "-C" - server: 2022-latest odbc-version: 18 flag: "-C" - - include: - - php: 8.3 - mssql: - server: 2017-latest - os: ubuntu-20.04 - - php: 8.3 - mssql: - server: 2019-latest - odbc-version: 18 - flag: "-C" - services: mssql: image: mcr.microsoft.com/mssql/server:${{ matrix.mssql.server }} @@ -62,19 +52,16 @@ jobs: ports: - 1433:1433 options: --name=mssql --health-cmd="/opt/mssql-tools${{ matrix.mssql.odbc-version }}/bin/sqlcmd ${{ matrix.mssql.flag }} -S localhost -U SA -P 'YourStrong!Passw0rd' -Q 'SELECT 1'" --health-interval=10s --health-timeout=5s --health-retries=3 - steps: - name: Install ODBC driver. run: | sudo curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list - sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18 - + sudo apt-get update + sudo ACCEPT_EULA=Y apt-get install -y msodbcsql${{ matrix.mssql.odbc-version }} - name: Checkout uses: actions/checkout@v3 - - name: Create MS SQL Database run: docker exec -i mssql /opt/mssql-tools${{ matrix.mssql.odbc-version }}/bin/sqlcmd ${{ matrix.mssql.flag }} -S localhost -U SA -P 'YourStrong!Passw0rd' -Q 'CREATE DATABASE yiitest' - - name: Install PHP with extensions uses: shivammathur/setup-php@v2 with: @@ -83,10 +70,8 @@ jobs: ini-values: date.timezone='UTC' coverage: pcov tools: composer:v2, pecl - - name: Determine composer cache directory run: echo "COMPOSER_CACHE_DIR=$(composer config cache-dir)" >> $GITHUB_ENV - - name: Cache dependencies installed with composer uses: actions/cache@v4 with: @@ -94,13 +79,10 @@ jobs: key: php${{ matrix.php }}-composer-${{ hashFiles('**/composer.json') }} restore-keys: | php${{ matrix.php }}-composer- - - name: Update composer run: composer self-update - - name: Install dependencies with composer run: composer update --prefer-dist --no-interaction --no-progress --optimize-autoloader --ansi - - name: Run tests with phpunit run: vendor/bin/phpunit --testsuite=Mssql --coverage-clover=coverage.xml --colors=always env: @@ -110,9 +92,8 @@ jobs: CYCLE_MSSQL_PORT: 1433 CYCLE_MSSQL_USER: SA CYCLE_MSSQL_PASSWORD: YourStrong!Passw0rd - - name: Upload coverage to Codecov uses: codecov/codecov-action@v3 with: token: ${{ secrets.CODECOV_TOKEN }} - files: ./coverage.xml + files: ./coverage.xml \ No newline at end of file diff --git a/docs/guide/en/PHP-8.5-MSSQL.md b/docs/guide/en/PHP-8.5-MSSQL.md new file mode 100644 index 0000000..e684454 --- /dev/null +++ b/docs/guide/en/PHP-8.5-MSSQL.md @@ -0,0 +1,204 @@ +# PHP 8.5 Implications for MSSQL Workflow (AI Source: Claude Sonnet 4.5 + - free try ) + +## Executive Summary + +**Do not add PHP 8.5 to the MSSQL workflow yet.** The current pdo_sqlsrv driver + (version 5.12) does not support PHP 8.5, and the workflow will fail during + PHP extension installation. + +## Critical Blocker: Driver Incompatibility + +### Current Situation + +The pdo_sqlsrv 5.12.0 extension specified in the workflow does not compile +against PHP 8.5.0 due to internal PHP API changes. This means any attempt to +add PHP 8.5 to the test matrix will result in immediate workflow failures. + +### Driver Support Status + +| PHP Version | pdo_sqlsrv 5.12 Support | +|-------------|------------------------| +| 8.1 | ✅ Fully Supported | +| 8.2 | ✅ Fully Supported | +| 8.3 | ✅ Fully Supported | +| 8.4 | ⚠️ Unofficial/Limited | +| 8.5 | ❌ Not Supported | + +## What Needs to Happen First + +Before PHP 8.5 can be added to the workflow: + +1. **Microsoft must release a new pdo_sqlsrv driver version** (likely 5.13 or 6.0) +2. **The new driver must be available via PECL** for installation through + shivammathur/setup-php +3. **The workflow's extension configuration must be updated** to reference the + new driver version + +## Timeline Expectations + +Based on historical patterns with previous PHP releases: + +- **Expected delay**: 2-6 months after PHP 8.5 official release +- **PHP 8.4 precedent**: As of late 2024/early 2025, PHP 8.4 still lacks full + official MSSQL driver support +- **Recommendation**: Monitor the Microsoft msphpsql repository for announcements + +## Recommended Action Plan + +### Phase 1: Monitoring (Current) + +Monitor these resources for updates: + +- [Microsoft msphpsql GitHub](https://github.com/microsoft/msphpsql) - Official + driver repository +- [PECL pdo_sqlsrv page](https://pecl.php.net/package/pdo_sqlsrv) - Release + announcements +- PHP 8.5 release notes and compatibility matrices + +### Phase 2: Early Testing (When Driver Available) + +Once a compatible driver is released: + +```yaml +strategy: + matrix: + php: + - 8.1 + - 8.2 + - 8.3 + - 8.4 + - 8.5 +``` + +Update the extensions configuration: + +```yaml +env: + extensions: pdo, pdo_sqlsrv-5.13 # Or whatever the new version is +``` + +Consider using `continue-on-error: true` initially for PHP 8.5 jobs: + +```yaml +- name: Run tests with phpunit + continue-on-error: ${{ matrix.php == '8.5' }} + run: vendor/bin/phpunit --testsuite=Mssql --coverage-clover=coverage.xml + --colors=always +``` + +### Phase 3: Full Integration + +After confirming stability: + +- Remove `continue-on-error` flag +- Make PHP 8.5 a required test in the CI pipeline + +## Potential Failure Points + +If you add PHP 8.5 prematurely, expect failures at: + +1. **Extension Installation Step** + ``` + shivammathur/setup-php@v2 + ``` + Error: Unable to install pdo_sqlsrv-5.12 for PHP 8.5 + +2. **Compilation Errors** + The driver may attempt to compile but fail due to API incompatibilities + +3. **Runtime Errors** + Even if installation succeeds, runtime incompatibilities may cause test failures + +## PHP 8.5 Features to Be Aware Of + +While waiting for driver support, note these PHP 8.5 changes that could impact + your codebase: + +- **Pipe operator**: New functional programming syntax +- **Clone with syntax**: Enhanced object cloning +- **Deprecations**: Non-canonical scalar type casts +- **Other improvements**: Property hooks, asymmetric visibility + +These changes are unlikely to directly affect database operations but may impact + application code. + +## Testing Strategy + +When driver support becomes available: + +1. **Create a separate test branch** with PHP 8.5 added to the matrix +2. **Run the full test suite** against all MSSQL versions (2017, 2019, 2022) +3. **Check for deprecation warnings** in test output +4. **Verify compatibility** with all PHP versions in the matrix +5. **Monitor for performance regressions** + +## Current Workflow Status + +The workflow currently tests: + +- **PHP versions**: 8.1, 8.2, 8.3, 8.4 +- **MSSQL versions**: 2017 (ODBC 17), 2019 (ODBC 18), 2022 (ODBC 18) +- **Driver version**: pdo_sqlsrv-5.12 + +This configuration is stable and should remain unchanged until driver +compatibility is confirmed. + +## Conclusion + +**Action Required**: None at this time. Continue monitoring for pdo_sqlsrv +driver updates. + +**Do Not**: Add PHP 8.5 to the test matrix until Microsoft releases a compatible +driver version. + +**Next Steps**: Watch the Microsoft msphpsql GitHub repository for release +announcements and update this document when new information becomes available. + +--- + +**Last Updated**: 21st January 2026 +**Status**: Awaiting pdo_sqlsrv driver support for PHP 8.5 + +## Actions checkout can also be upgraded to version 6? + +**What's New in v6** +Version 6 includes Node.js 24 support and persists credentials to a separate +file PHP, along with worktree support improvements. + +**Upgrade Path** +You can upgrade safely from v3 → v4 → v5 → v6, or jump directly to v6. The +action maintains backwards compatibility for basic usage. + +**Updated Workflow** +Here's your workflow with the checkout action upgraded to v6: + +yaml- name: Checkout + uses: actions/checkout@v4 # Can be upgraded to @v6 + +Should become: +yaml- name: Checkout + uses: actions/checkout@v6 + +**Should You Upgrade?** +Yes, you should upgrade for several reasons: + +**Security updates - Newer versions include security patches** +Node.js 24 support - Better performance and compatibility + +**Bug fixes - Various improvements and stability enhancements** +Future-proofing - v3 is quite old and may eventually be deprecated + +Migration Considerations +The upgrade from v3 to v6 should be seamless for your use case since you're +using the basic checkout without special parameters. + +**However, it's good practice to:** + +1. Test the workflow in a feature branch first +2. Review the changelog for any breaking changes +3. Consider pinning to a specific commit SHA for maximum stability in production +(e.g., actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8) + +For your workflow, the simple version upgrade is perfectly fine and recommended! +Claude is AI and can make mistakes. Please double-check cited sources. \ No newline at end of file diff --git a/docs/guide/ru/PHP-8.5-MSSQL.md b/docs/guide/ru/PHP-8.5-MSSQL.md new file mode 100644 index 0000000..841f608 --- /dev/null +++ b/docs/guide/ru/PHP-8.5-MSSQL.md @@ -0,0 +1,193 @@ +# Последствия использования PHP 8.5 для рабочего процесса MSSQL (Источник ИИ: Claude Sonnet 4.5 - бесплатная пробная версия) + +## Краткое резюме + +**Не добавляйте PHP 8.5 в рабочий процесс MSSQL пока.** Текущий драйвер pdo_sqlsrv (версия 5.12) не поддерживает PHP 8.5, и рабочий процесс завершится ошибкой во время установки расширений PHP. + +## Критический блокер: несовместимость драйвера + +### Текущая ситуация + +Расширение pdo_sqlsrv 5.12.0, указанное в рабочем процессе, не компилируется с PHP 8.5.0 из-за изменений во внутреннем API PHP. Это означает, что любая попытка добавить PHP 8.5 в тестовую матрицу приведет к немедленному сбою рабочего процесса. + +### Статус поддержки драйвера + +| Версия PHP | Поддержка pdo_sqlsrv 5.12 | +|------------|---------------------------| +| 8.1 | ✅ Полная поддержка | +| 8.2 | ✅ Полная поддержка | +| 8.3 | ✅ Полная поддержка | +| 8.4 | ⚠️ Неофициальная/Ограниченная | +| 8.5 | ❌ Не поддерживается | + +## Что должно произойти в первую очередь + +Прежде чем PHP 8.5 можно будет добавить в рабочий процесс: + +1. **Microsoft должна выпустить новую версию драйвера pdo_sqlsrv** (вероятно, 5.13 или 6.0) +2. **Новый драйвер должен быть доступен через PECL** для установки через shivammathur/setup-php +3. **Конфигурация расширений рабочего процесса должна быть обновлена** для ссылки на новую версию драйвера + +## Ожидания по срокам + +На основе исторических закономерностей с предыдущими релизами PHP: + +- **Ожидаемая задержка**: 2-6 месяцев после официального выпуска PHP 8.5 +- **Прецедент PHP 8.4**: По состоянию на конец 2024/начало 2025 года PHP 8.4 все еще не имеет полной официальной поддержки драйвера MSSQL +- **Рекомендация**: Следите за репозиторием Microsoft msphpsql для объявлений + +## Рекомендуемый план действий + +### Фаза 1: Мониторинг (Текущая) + +Отслеживайте обновления в следующих ресурсах: + +- [Microsoft msphpsql GitHub](https://github.com/microsoft/msphpsql) - Официальный репозиторий драйвера +- [Страница PECL pdo_sqlsrv](https://pecl.php.net/package/pdo_sqlsrv) - Объявления о релизах +- Примечания к выпуску PHP 8.5 и матрицы совместимости + +### Фаза 2: Раннее тестирование (Когда драйвер станет доступен) + +После выпуска совместимого драйвера: + +```yaml +strategy: + matrix: + php: + - 8.1 + - 8.2 + - 8.3 + - 8.4 + - 8.5 +``` + +Обновите конфигурацию расширений: + +```yaml +env: + extensions: pdo, pdo_sqlsrv-5.13 # Или какая бы ни была новая версия +``` + +Рассмотрите возможность использования `continue-on-error: true` первоначально для заданий PHP 8.5: + +```yaml +- name: Run tests with phpunit + continue-on-error: ${{ matrix.php == '8.5' }} + run: vendor/bin/phpunit --testsuite=Mssql --coverage-clover=coverage.xml + --colors=always +``` + +### Фаза 3: Полная интеграция + +После подтверждения стабильности: + +- Удалите флаг `continue-on-error` +- Сделайте PHP 8.5 обязательным тестом в конвейере CI + +## Потенциальные точки отказа + +Если вы добавите PHP 8.5 преждевременно, ожидайте сбоев на следующих этапах: + +1. **Этап установки расширений** + ``` + shivammathur/setup-php@v2 + ``` + Ошибка: Невозможно установить pdo_sqlsrv-5.12 для PHP 8.5 + +2. **Ошибки компиляции** + Драйвер может попытаться скомпилироваться, но потерпит неудачу из-за несовместимости API + +3. **Ошибки времени выполнения** + Даже если установка пройдет успешно, несовместимость во время выполнения может привести к сбою тестов + +## Функции PHP 8.5, которые следует учитывать + +Ожидая поддержки драйвера, обратите внимание на эти изменения PHP 8.5, которые могут повлиять на вашу кодовую базу: + +- **Оператор pipe**: Новый синтаксис функционального программирования +- **Синтаксис clone with**: Улучшенное клонирование объектов +- **Устаревшие функции**: Неканонические приведения скалярных типов +- **Другие улучшения**: Хуки свойств, асимметричная видимость + +Эти изменения вряд ли напрямую повлияют на операции с базой данных, но могут повлиять на код приложения. + +## Стратегия тестирования + +Когда поддержка драйвера станет доступной: + +1. **Создайте отдельную тестовую ветку** с PHP 8.5, добавленным в матрицу +2. **Запустите полный набор тестов** для всех версий MSSQL (2017, 2019, 2022) +3. **Проверьте предупреждения об устаревании** в выводе тестов +4. **Проверьте совместимость** со всеми версиями PHP в матрице +5. **Отслеживайте регрессии производительности** + +## Текущий статус рабочего процесса + +Рабочий процесс в настоящее время тестирует: + +- **Версии PHP**: 8.1, 8.2, 8.3, 8.4 +- **Версии MSSQL**: 2017 (ODBC 17), 2019 (ODBC 18), 2022 (ODBC 18) +- **Версия драйвера**: pdo_sqlsrv-5.12 + +Эта конфигурация стабильна и должна оставаться неизменной до подтверждения совместимости драйвера. + +## Заключение + +**Требуемое действие**: В настоящее время никакого. Продолжайте мониторинг обновлений драйвера pdo_sqlsrv. + +**Не делайте**: Не добавляйте PHP 8.5 в тестовую матрицу, пока Microsoft не выпустит совместимую версию драйвера. + +**Следующие шаги**: Следите за репозиторием Microsoft msphpsql на GitHub для объявлений о релизах и обновляйте этот документ, когда станет доступна новая информация. + +--- + +**Последнее обновление**: 21 января 2026 г. +**Статус**: Ожидание поддержки драйвера pdo_sqlsrv для PHP 8.5 + +## Можно ли также обновить actions checkout до версии 6? + +**Что нового в v6** +Версия 6 включает поддержку Node.js 24 и сохраняет учетные данные в отдельный файл PHP, а также улучшения поддержки worktree. + +**Путь обновления** +Вы можете безопасно обновиться с v3 → v4 → v5 → v6 или перейти сразу на v6. Действие поддерживает обратную совместимость для базового использования. + +**Обновленный рабочий процесс** +Вот ваш рабочий процесс с действием checkout, обновленным до v6: + +```yaml +- name: Checkout + uses: actions/checkout@v4 # Можно обновить до @v6 +``` + +Должно стать: + +```yaml +- name: Checkout + uses: actions/checkout@v6 +``` + +**Стоит ли обновляться?** +Да, вам следует обновиться по нескольким причинам: + +**Обновления безопасности** - Новые версии включают исправления безопасности +**Поддержка Node.js 24** - Лучшая производительность и совместимость + +**Исправления ошибок** - Различные улучшения и повышение стабильности +**Подготовка к будущему** - v3 довольно старая и может в конечном итоге устареть + +## Соображения при миграции + +Обновление с v3 до v6 должно быть безболезненным для вашего случая использования, поскольку вы используете базовый checkout без специальных параметров. + +**Однако рекомендуется:** + +1. Сначала протестировать рабочий процесс в функциональной ветке +2. Просмотреть changelog на наличие критических изменений +3. Рассмотреть возможность закрепления на конкретном SHA коммита для максимальной стабильности в продакшене (например, actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8) + +Для вашего рабочего процесса простое обновление версии вполне приемлемо и рекомендуется! + +--- + +Claude - это ИИ и может делать ошибки. Пожалуйста, перепроверяйте цитируемые источники. From 35941120eb813f534e25945b24b1f71036810e59 Mon Sep 17 00:00:00 2001 From: Ross Addison Date: Wed, 21 Jan 2026 13:01:52 +0000 Subject: [PATCH 02/17] Workflow Action Test 2 --- .github/workflows/mssql.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/mssql.yml b/.github/workflows/mssql.yml index 9d94bed..e5ccd82 100644 --- a/.github/workflows/mssql.yml +++ b/.github/workflows/mssql.yml @@ -30,18 +30,20 @@ jobs: - 8.1 - 8.2 - 8.3 - - 8.4 - # - 8.5 # Wait for pdo_sqlsrv 5.13+ or equivalent + - 8.4 mssql: - server: 2017-latest odbc-version: 17 flag: "" + tools-path: "/opt/mssql-tools" - server: 2019-latest odbc-version: 18 flag: "-C" + tools-path: "/opt/mssql-tools18" - server: 2022-latest odbc-version: 18 flag: "-C" + tools-path: "/opt/mssql-tools18" services: mssql: image: mcr.microsoft.com/mssql/server:${{ matrix.mssql.server }} @@ -51,7 +53,7 @@ jobs: MSSQL_PID: Developer ports: - 1433:1433 - options: --name=mssql --health-cmd="/opt/mssql-tools${{ matrix.mssql.odbc-version }}/bin/sqlcmd ${{ matrix.mssql.flag }} -S localhost -U SA -P 'YourStrong!Passw0rd' -Q 'SELECT 1'" --health-interval=10s --health-timeout=5s --health-retries=3 + options: --name=mssql --health-cmd="${{ matrix.mssql.tools-path }}/bin/sqlcmd ${{ matrix.mssql.flag }} -S localhost -U SA -P 'YourStrong!Passw0rd' -Q 'SELECT 1'" --health-interval=10s --health-timeout=5s --health-retries=3 steps: - name: Install ODBC driver. run: | @@ -59,9 +61,9 @@ jobs: sudo apt-get update sudo ACCEPT_EULA=Y apt-get install -y msodbcsql${{ matrix.mssql.odbc-version }} - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Create MS SQL Database - run: docker exec -i mssql /opt/mssql-tools${{ matrix.mssql.odbc-version }}/bin/sqlcmd ${{ matrix.mssql.flag }} -S localhost -U SA -P 'YourStrong!Passw0rd' -Q 'CREATE DATABASE yiitest' + run: docker exec -i mssql ${{ matrix.mssql.tools-path }}/bin/sqlcmd ${{ matrix.mssql.flag }} -S localhost -U SA -P 'YourStrong!Passw0rd' -Q 'CREATE DATABASE yiitest' - name: Install PHP with extensions uses: shivammathur/setup-php@v2 with: @@ -96,4 +98,4 @@ jobs: uses: codecov/codecov-action@v3 with: token: ${{ secrets.CODECOV_TOKEN }} - files: ./coverage.xml \ No newline at end of file + files: ./coverage.xml From 2b07a72ec4ea463827afdaa19996fa6147f4d43e Mon Sep 17 00:00:00 2001 From: Ross Addison Date: Wed, 21 Jan 2026 19:38:38 +0000 Subject: [PATCH 03/17] Workflow Action Test 3 --- .github/workflows/mssql.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/mssql.yml b/.github/workflows/mssql.yml index e5ccd82..0c944ee 100644 --- a/.github/workflows/mssql.yml +++ b/.github/workflows/mssql.yml @@ -57,9 +57,10 @@ jobs: steps: - name: Install ODBC driver. run: | - sudo curl https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list - sudo apt-get update - sudo ACCEPT_EULA=Y apt-get install -y msodbcsql${{ matrix.mssql.odbc-version }} + curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg + curl -fsSL https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list + sudo apt-get update + sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18 || sudo ACCEPT_EULA=Y apt-get install -y msodbcsql17 - name: Checkout uses: actions/checkout@v4 - name: Create MS SQL Database From 9bdd3e14f5625618f4ec3b532c7c5973929aa3df Mon Sep 17 00:00:00 2001 From: Ross Addison Date: Wed, 21 Jan 2026 19:46:09 +0000 Subject: [PATCH 04/17] Workflow Action Test 4 --- .github/workflows/mssql.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/mssql.yml b/.github/workflows/mssql.yml index 0c944ee..a706749 100644 --- a/.github/workflows/mssql.yml +++ b/.github/workflows/mssql.yml @@ -57,9 +57,9 @@ jobs: steps: - name: Install ODBC driver. run: | - curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | sudo gpg --dearmor -o /usr/share/keyrings/microsoft-prod.gpg + curl -fsSL https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor | sudo tee /usr/share/keyrings/microsoft-prod.gpg > /dev/null curl -fsSL https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/prod.list | sudo tee /etc/apt/sources.list.d/mssql-release.list - sudo apt-get update + sudo apt-get update sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18 || sudo ACCEPT_EULA=Y apt-get install -y msodbcsql17 - name: Checkout uses: actions/checkout@v4 From c2dac4fb9c2477b2c9828b4d4fe9bdfddea80b8f Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Wed, 21 Jan 2026 20:00:06 +0000 Subject: [PATCH 05/17] Apply fixes from StyleCI --- rector.php | 6 ++--- src/Reader/Cache/CachedCount.php | 7 +++++- src/Reader/EntityReader.php | 16 +++++++++----- src/Reader/FilterHandler/AllHandler.php | 2 +- src/Reader/FilterHandler/AndXHandler.php | 2 +- src/Reader/FilterHandler/BetweenHandler.php | 4 ++-- src/Reader/FilterHandler/EqualsHandler.php | 2 +- .../FilterHandler/EqualsNullHandler.php | 2 +- .../FilterHandler/GreaterThanHandler.php | 2 +- .../GreaterThanOrEqualHandler.php | 2 +- src/Reader/FilterHandler/InHandler.php | 2 +- src/Reader/FilterHandler/LessThanHandler.php | 2 +- .../FilterHandler/LessThanOrEqualHandler.php | 2 +- .../LikeHandler/BaseLikeHandler.php | 13 ++++++----- .../LikeHandler/LikeHandlerFactory.php | 8 +++---- .../LikeHandler/MysqlLikeHandler.php | 3 +-- .../LikeHandler/PostgresLikeHandler.php | 3 +-- .../LikeHandler/SqlServerLikeHandler.php | 3 +-- .../LikeHandler/SqliteLikeHandler.php | 3 +-- src/Reader/FilterHandler/NoneHandler.php | 2 +- src/Reader/FilterHandler/NotHandler.php | 17 +++++++------- src/Reader/FilterHandler/OrXHandler.php | 2 +- src/Writer/EntityWriter.php | 6 +++-- .../Base/Reader/BaseEntityReaderTestCase.php | 4 ++-- tests/Feature/DataTrait.php | 22 +++++++++---------- .../Feature/Mssql/Reader/EntityReaderTest.php | 2 +- .../Feature/Mysql/Reader/EntityReaderTest.php | 2 +- tests/Support/NotSupportedFilter.php | 4 +++- tests/Support/StubFilter.php | 4 +++- .../Reader/Cache/CachedCollectionTest.php | 4 ++-- tests/Unit/Reader/Cache/CachedCountTest.php | 2 +- tests/Unit/Reader/EntityReaderTest.php | 2 +- 32 files changed, 85 insertions(+), 72 deletions(-) diff --git a/rector.php b/rector.php index 54537c2..c49ca30 100644 --- a/rector.php +++ b/rector.php @@ -5,13 +5,13 @@ use Rector\CodeQuality\Rector\Class_\InlineConstructorDefaultToPropertyRector; use Rector\Config\RectorConfig; use Rector\Php74\Rector\Closure\ClosureToArrowFunctionRector; -use Rector\Php81\Rector\Property\ReadOnlyPropertyRector; use Rector\Php81\Rector\FuncCall\NullToStrictStringFuncCallArgRector; +use Rector\Php81\Rector\Property\ReadOnlyPropertyRector; return RectorConfig::configure() ->withPaths([ - __DIR__ . '/src', - __DIR__ . '/tests', + __DIR__.'/src', + __DIR__.'/tests', ]) ->withPhpSets(php81: true) ->withRules([ diff --git a/src/Reader/Cache/CachedCount.php b/src/Reader/Cache/CachedCount.php index 6aec74b..429561e 100644 --- a/src/Reader/Cache/CachedCount.php +++ b/src/Reader/Cache/CachedCount.php @@ -13,10 +13,13 @@ final class CachedCount */ private ?int $count = null; - public function __construct(private ?Countable $collection) {} + public function __construct(private ?Countable $collection) + { + } /** * @psalm-internal Yiisoft\Data\Cycle\Reader + * * @psalm-return non-negative-int */ public function getCount(): int @@ -31,10 +34,12 @@ private function cacheCount(): int { /** * @psalm-suppress PossiblyNullReference + * * @psalm-var non-negative-int */ $this->count = $this->collection->count(); $this->collection = null; + return $this->count; } } diff --git a/src/Reader/EntityReader.php b/src/Reader/EntityReader.php index 8d3d34e..8271a03 100644 --- a/src/Reader/EntityReader.php +++ b/src/Reader/EntityReader.php @@ -10,15 +10,15 @@ use Cycle\ORM\Select\QueryBuilder; use Generator; use InvalidArgumentException; +use Override; use Yiisoft\Data\Cycle\Exception\NotSupportedFilterException; +use Yiisoft\Data\Cycle\Reader\Cache\CachedCollection; +use Yiisoft\Data\Cycle\Reader\Cache\CachedCount; use Yiisoft\Data\Cycle\Reader\FilterHandler\LikeHandler\LikeHandlerFactory; use Yiisoft\Data\Reader\DataReaderInterface; use Yiisoft\Data\Reader\Filter\All; use Yiisoft\Data\Reader\FilterInterface; 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; @@ -105,6 +105,7 @@ public function withLimit(?int $limit): static $new->limit = $limit; $new->itemsCache = new CachedCollection(); } + return $new; } @@ -119,6 +120,7 @@ public function withOffset(int $offset): static $new->offset = $offset; $new->itemsCache = new CachedCollection(); } + return $new; } @@ -134,6 +136,7 @@ public function withSort(?Sort $sort): static $new->itemsCache = new CachedCollection(); $new->oneItemCache = new CachedCollection(); } + return $new; } @@ -151,6 +154,7 @@ public function withFilter(FilterInterface $filter): static /** @psalm-suppress ImpureMethodCall */ $new->resetCountCache(); } + return $new; } @@ -167,6 +171,7 @@ public function read(): iterable $query = $this->buildSelectQuery(); $this->itemsCache->setCollection($query->fetchAll()); } + return $this->itemsCache->getCollection(); } @@ -186,7 +191,7 @@ public function readOne(): array|object|null } /** - * Get Iterator without caching + * Get Iterator without caching. */ #[Override] public function getIterator(): Generator @@ -197,6 +202,7 @@ public function getIterator(): Generator public function getSql(): string { $query = $this->buildSelectQuery(); + return (string) ($query instanceof Select ? $query->buildQuery() : $query); } @@ -270,7 +276,7 @@ private function normalizeSortingCriteria(array $criteria): array if (is_int($direction)) { $direction = match ($direction) { SORT_DESC => 'DESC', - default => 'ASC', + default => 'ASC', }; } $criteria[$field] = $direction; diff --git a/src/Reader/FilterHandler/AllHandler.php b/src/Reader/FilterHandler/AllHandler.php index e7b24c4..e7e51ed 100644 --- a/src/Reader/FilterHandler/AllHandler.php +++ b/src/Reader/FilterHandler/AllHandler.php @@ -7,10 +7,10 @@ use Cycle\Database\Injection\Expression; use Cycle\Database\Query\SelectQuery; use Cycle\ORM\Select\QueryBuilder; +use Override; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\All; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class AllHandler implements QueryBuilderFilterHandler { diff --git a/src/Reader/FilterHandler/AndXHandler.php b/src/Reader/FilterHandler/AndXHandler.php index 6dfcbfe..a4337b7 100644 --- a/src/Reader/FilterHandler/AndXHandler.php +++ b/src/Reader/FilterHandler/AndXHandler.php @@ -6,11 +6,11 @@ use Cycle\Database\Query\SelectQuery; use Cycle\ORM\Select\QueryBuilder; +use Override; use Yiisoft\Data\Cycle\Exception\NotSupportedFilterException; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\AndX; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class AndXHandler implements QueryBuilderFilterHandler { diff --git a/src/Reader/FilterHandler/BetweenHandler.php b/src/Reader/FilterHandler/BetweenHandler.php index a2361e5..a02305d 100644 --- a/src/Reader/FilterHandler/BetweenHandler.php +++ b/src/Reader/FilterHandler/BetweenHandler.php @@ -4,10 +4,10 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler; +use Override; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\Between; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class BetweenHandler implements QueryBuilderFilterHandler { @@ -20,7 +20,7 @@ public function getFilterClass(): string #[Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { - /** @var Between $filter */ + /** @var Between $filter */ return [$filter->field, 'between', $filter->minValue, $filter->maxValue]; } diff --git a/src/Reader/FilterHandler/EqualsHandler.php b/src/Reader/FilterHandler/EqualsHandler.php index 1cc1229..65e66c9 100644 --- a/src/Reader/FilterHandler/EqualsHandler.php +++ b/src/Reader/FilterHandler/EqualsHandler.php @@ -4,10 +4,10 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler; +use Override; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\Equals; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class EqualsHandler implements QueryBuilderFilterHandler { diff --git a/src/Reader/FilterHandler/EqualsNullHandler.php b/src/Reader/FilterHandler/EqualsNullHandler.php index fd9059d..215d7ba 100644 --- a/src/Reader/FilterHandler/EqualsNullHandler.php +++ b/src/Reader/FilterHandler/EqualsNullHandler.php @@ -4,10 +4,10 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler; +use Override; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\EqualsNull; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class EqualsNullHandler implements QueryBuilderFilterHandler { diff --git a/src/Reader/FilterHandler/GreaterThanHandler.php b/src/Reader/FilterHandler/GreaterThanHandler.php index 0fc85e4..cefdf13 100644 --- a/src/Reader/FilterHandler/GreaterThanHandler.php +++ b/src/Reader/FilterHandler/GreaterThanHandler.php @@ -4,10 +4,10 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler; +use Override; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\GreaterThan; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class GreaterThanHandler implements QueryBuilderFilterHandler { diff --git a/src/Reader/FilterHandler/GreaterThanOrEqualHandler.php b/src/Reader/FilterHandler/GreaterThanOrEqualHandler.php index 22abdb6..b64855e 100644 --- a/src/Reader/FilterHandler/GreaterThanOrEqualHandler.php +++ b/src/Reader/FilterHandler/GreaterThanOrEqualHandler.php @@ -4,10 +4,10 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler; +use Override; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\GreaterThanOrEqual; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class GreaterThanOrEqualHandler implements QueryBuilderFilterHandler { diff --git a/src/Reader/FilterHandler/InHandler.php b/src/Reader/FilterHandler/InHandler.php index fd521d8..18b7b70 100644 --- a/src/Reader/FilterHandler/InHandler.php +++ b/src/Reader/FilterHandler/InHandler.php @@ -5,10 +5,10 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler; use Cycle\Database\Injection\Parameter; +use Override; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\In; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class InHandler implements QueryBuilderFilterHandler { diff --git a/src/Reader/FilterHandler/LessThanHandler.php b/src/Reader/FilterHandler/LessThanHandler.php index 43d8d3c..851c8ff 100644 --- a/src/Reader/FilterHandler/LessThanHandler.php +++ b/src/Reader/FilterHandler/LessThanHandler.php @@ -4,10 +4,10 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler; +use Override; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\LessThan; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class LessThanHandler implements QueryBuilderFilterHandler { diff --git a/src/Reader/FilterHandler/LessThanOrEqualHandler.php b/src/Reader/FilterHandler/LessThanOrEqualHandler.php index 83ddc85..702e07c 100644 --- a/src/Reader/FilterHandler/LessThanOrEqualHandler.php +++ b/src/Reader/FilterHandler/LessThanOrEqualHandler.php @@ -4,10 +4,10 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler; +use Override; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\LessThanOrEqual; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class LessThanOrEqualHandler implements QueryBuilderFilterHandler { diff --git a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php index 027d416..8109ca8 100644 --- a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php @@ -4,17 +4,17 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler\LikeHandler; +use Override; use Stringable; 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 { protected array $escapingReplacements = [ - '%' => '\%', - '_' => '\_', + '%' => '\%', + '_' => '\_', '\\' => '\\\\', ]; @@ -27,10 +27,11 @@ public function getFilterClass(): string protected function prepareValue(string|Stringable $value, LikeMode $mode): string { $value = strtr((string) $value, $this->escapingReplacements); + return match ($mode) { - LikeMode::Contains => '%' . $value . '%', - LikeMode::StartsWith => $value . '%', - LikeMode::EndsWith => '%' . $value, + LikeMode::Contains => '%'.$value.'%', + LikeMode::StartsWith => $value.'%', + LikeMode::EndsWith => '%'.$value, }; } } diff --git a/src/Reader/FilterHandler/LikeHandler/LikeHandlerFactory.php b/src/Reader/FilterHandler/LikeHandler/LikeHandlerFactory.php index c6bcf85..8c9b3c8 100644 --- a/src/Reader/FilterHandler/LikeHandler/LikeHandlerFactory.php +++ b/src/Reader/FilterHandler/LikeHandler/LikeHandlerFactory.php @@ -17,11 +17,11 @@ public static function getLikeHandler(string $driverType): QueryBuilderFilterHan // default - ignored due to the complexity of testing and preventing splitting of databaseDriver argument. // @codeCoverageIgnoreStart return match ($driverType) { - 'SQLite' => new SqliteLikeHandler(), - 'MySQL' => new MysqlLikeHandler(), - 'Postgres' => new PostgresLikeHandler(), + 'SQLite' => new SqliteLikeHandler(), + 'MySQL' => new MysqlLikeHandler(), + 'Postgres' => new PostgresLikeHandler(), 'SQLServer' => new SqlServerLikeHandler(), - default => throw new RuntimeException("$driverType database driver is not supported."), + default => throw new RuntimeException("$driverType database driver is not supported."), }; // @codeCoverageIgnoreEnd } diff --git a/src/Reader/FilterHandler/LikeHandler/MysqlLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/MysqlLikeHandler.php index 5e5fa2a..78f66df 100644 --- a/src/Reader/FilterHandler/LikeHandler/MysqlLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/MysqlLikeHandler.php @@ -4,9 +4,9 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler\LikeHandler; +use Override; use Yiisoft\Data\Reader\Filter\Like; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class MysqlLikeHandler extends BaseLikeHandler { @@ -14,7 +14,6 @@ final class MysqlLikeHandler extends BaseLikeHandler public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var Like $filter */ - if ($filter->caseSensitive !== true) { return [$filter->field, 'like', $this->prepareValue($filter->value, $filter->mode)]; } diff --git a/src/Reader/FilterHandler/LikeHandler/PostgresLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/PostgresLikeHandler.php index a5a06e6..d885e3e 100644 --- a/src/Reader/FilterHandler/LikeHandler/PostgresLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/PostgresLikeHandler.php @@ -4,9 +4,9 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler\LikeHandler; +use Override; use Yiisoft\Data\Reader\Filter\Like; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class PostgresLikeHandler extends BaseLikeHandler { @@ -14,7 +14,6 @@ final class PostgresLikeHandler extends BaseLikeHandler public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var Like $filter */ - if ($filter->caseSensitive !== true) { return [$filter->field, 'ilike', $this->prepareValue($filter->value, $filter->mode)]; } diff --git a/src/Reader/FilterHandler/LikeHandler/SqlServerLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/SqlServerLikeHandler.php index ff875c7..49aacbf 100644 --- a/src/Reader/FilterHandler/LikeHandler/SqlServerLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/SqlServerLikeHandler.php @@ -4,10 +4,10 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler\LikeHandler; +use Override; use Yiisoft\Data\Cycle\Exception\NotSupportedFilterOptionException; use Yiisoft\Data\Reader\Filter\Like; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class SqlServerLikeHandler extends BaseLikeHandler { @@ -20,7 +20,6 @@ public function __construct() public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var Like $filter */ - if ($filter->caseSensitive === true) { throw new NotSupportedFilterOptionException(optionName: 'caseSensitive', driverType: 'SQLServer'); } diff --git a/src/Reader/FilterHandler/LikeHandler/SqliteLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/SqliteLikeHandler.php index 3786d96..2a851a5 100644 --- a/src/Reader/FilterHandler/LikeHandler/SqliteLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/SqliteLikeHandler.php @@ -4,10 +4,10 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler\LikeHandler; +use Override; use Yiisoft\Data\Cycle\Exception\NotSupportedFilterOptionException; use Yiisoft\Data\Reader\Filter\Like; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class SqliteLikeHandler extends BaseLikeHandler { @@ -20,7 +20,6 @@ public function __construct() public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var Like $filter */ - if ($filter->caseSensitive === true) { throw new NotSupportedFilterOptionException(optionName: 'caseSensitive', driverType: 'SQLite'); } diff --git a/src/Reader/FilterHandler/NoneHandler.php b/src/Reader/FilterHandler/NoneHandler.php index d6f0bfe..deaf342 100644 --- a/src/Reader/FilterHandler/NoneHandler.php +++ b/src/Reader/FilterHandler/NoneHandler.php @@ -7,10 +7,10 @@ use Cycle\Database\Injection\Expression; use Cycle\Database\Query\SelectQuery; use Cycle\ORM\Select\QueryBuilder; +use Override; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\None; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class NoneHandler implements QueryBuilderFilterHandler { diff --git a/src/Reader/FilterHandler/NotHandler.php b/src/Reader/FilterHandler/NotHandler.php index 37ce2ee..457b198 100644 --- a/src/Reader/FilterHandler/NotHandler.php +++ b/src/Reader/FilterHandler/NotHandler.php @@ -4,6 +4,7 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler; +use Override; use Yiisoft\Data\Cycle\Exception\NotSupportedFilterException; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\AndX; @@ -19,7 +20,6 @@ use Yiisoft\Data\Reader\Filter\Not; use Yiisoft\Data\Reader\Filter\OrX; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class NotHandler implements QueryBuilderFilterHandler { @@ -33,7 +33,6 @@ public function getFilterClass(): string public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var Not $filter */ - $convertedFilter = $this->convertFilter($filter->filter); $handledFilter = $convertedFilter instanceof Not ? $convertedFilter->filter : $convertedFilter; $handler = $handlers[$handledFilter::class] ?? null; @@ -49,7 +48,7 @@ public function getAsWhereArguments(FilterInterface $filter, array $handlers): a $operator = $where[1]; $where[1] = match ($operator) { 'between', 'in', 'like' => "not $operator", - '=' => '!=', + '=' => '!=', default => $operator, }; @@ -63,23 +62,23 @@ private function convertFilter(FilterInterface $filter, int $notCount = 1): Filt return match ($filter::class) { AndX::class => new OrX( ...array_map( - static fn(FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), + static fn (FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), $filter->filters, ), ), OrX::class => new AndX( ...array_map( - static fn(FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), + static fn (FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), $filter->filters, ), ), - GreaterThan::class => new LessThanOrEqual($filter->field, $filter->value), + GreaterThan::class => new LessThanOrEqual($filter->field, $filter->value), GreaterThanOrEqual::class => new LessThan($filter->field, $filter->value), - LessThan::class => new GreaterThanOrEqual($filter->field, $filter->value), - LessThanOrEqual::class => new GreaterThan($filter->field, $filter->value), + LessThan::class => new GreaterThanOrEqual($filter->field, $filter->value), + LessThanOrEqual::class => new GreaterThan($filter->field, $filter->value), Between::class, Equals::class, EqualsNull::class, In::class, Like::class => new Not($filter), Not::class => $this->convertNot($filter, $notCount), - default => $filter, + default => $filter, }; } diff --git a/src/Reader/FilterHandler/OrXHandler.php b/src/Reader/FilterHandler/OrXHandler.php index e79da00..44d5792 100644 --- a/src/Reader/FilterHandler/OrXHandler.php +++ b/src/Reader/FilterHandler/OrXHandler.php @@ -6,11 +6,11 @@ use Cycle\Database\Query\SelectQuery; use Cycle\ORM\Select\QueryBuilder; +use Override; use Yiisoft\Data\Cycle\Exception\NotSupportedFilterException; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\OrX; use Yiisoft\Data\Reader\FilterInterface; -use Override; final class OrXHandler implements QueryBuilderFilterHandler { diff --git a/src/Writer/EntityWriter.php b/src/Writer/EntityWriter.php index d6bc72e..deb562c 100644 --- a/src/Writer/EntityWriter.php +++ b/src/Writer/EntityWriter.php @@ -5,13 +5,15 @@ namespace Yiisoft\Data\Cycle\Writer; use Cycle\ORM\EntityManagerInterface; +use Override; use Throwable; use Yiisoft\Data\Writer\DataWriterInterface; -use Override; final class EntityWriter implements DataWriterInterface { - public function __construct(private EntityManagerInterface $entityManager) {} + public function __construct(private EntityManagerInterface $entityManager) + { + } /** * @throws Throwable diff --git a/tests/Feature/Base/Reader/BaseEntityReaderTestCase.php b/tests/Feature/Base/Reader/BaseEntityReaderTestCase.php index a03c679..4b42b1f 100644 --- a/tests/Feature/Base/Reader/BaseEntityReaderTestCase.php +++ b/tests/Feature/Base/Reader/BaseEntityReaderTestCase.php @@ -20,9 +20,9 @@ use Yiisoft\Data\Reader\Sort; use Yiisoft\Data\Tests\Common\FixtureTrait; +use function count; use function iterator_to_array; use function preg_replace; -use function count; use function sprintf; abstract class BaseEntityReaderTestCase extends TestCase @@ -189,7 +189,7 @@ public static function dataGetSql(): array { return [ 'base' => [ - << ['connection' => static::$DRIVER ?? 'sqlite'], - 'sqlite' => ['connection' => 'sqlite'], + 'sqlite' => ['connection' => 'sqlite'], ]; $connections = [ 'sqlite' => new SQLiteDriverConfig( @@ -220,27 +220,27 @@ private function createOrm(): ORMInterface } /** - * Cycle ORM Schema + * Cycle ORM Schema. */ private function createSchema(): SchemaInterface { return new Schema([ 'user' => [ - SchemaInterface::MAPPER => StdMapper::class, - SchemaInterface::DATABASE => 'default', - SchemaInterface::TABLE => 'user', + SchemaInterface::MAPPER => StdMapper::class, + SchemaInterface::DATABASE => 'default', + SchemaInterface::TABLE => 'user', SchemaInterface::PRIMARY_KEY => 'id', - SchemaInterface::COLUMNS => [ + SchemaInterface::COLUMNS => [ // property => column - 'id' => 'id', - 'number' => 'number', - 'email' => 'email', + 'id' => 'id', + 'number' => 'number', + 'email' => 'email', 'balance' => 'balance', 'born_at' => 'born_at', ], SchemaInterface::TYPECAST => [ - 'id' => 'int', - 'number' => 'int', + 'id' => 'int', + 'number' => 'int', 'balance' => 'float', 'born_at' => 'datetime', ], diff --git a/tests/Feature/Mssql/Reader/EntityReaderTest.php b/tests/Feature/Mssql/Reader/EntityReaderTest.php index b525cee..ac047f6 100644 --- a/tests/Feature/Mssql/Reader/EntityReaderTest.php +++ b/tests/Feature/Mssql/Reader/EntityReaderTest.php @@ -14,7 +14,7 @@ public static function dataGetSql(): array { return [ 'base' => [ - << [ - << Date: Wed, 21 Jan 2026 20:05:13 +0000 Subject: [PATCH 06/17] Apply PHP CS Fixer and Rector changes (CI) --- src/Reader/Cache/CachedCount.php | 4 +--- src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php | 6 +++--- src/Reader/FilterHandler/NotHandler.php | 4 ++-- src/Writer/EntityWriter.php | 4 +--- tests/Support/NotSupportedFilter.php | 4 +--- tests/Support/StubFilter.php | 4 +--- 6 files changed, 9 insertions(+), 17 deletions(-) diff --git a/src/Reader/Cache/CachedCount.php b/src/Reader/Cache/CachedCount.php index 429561e..e4b3e2c 100644 --- a/src/Reader/Cache/CachedCount.php +++ b/src/Reader/Cache/CachedCount.php @@ -13,9 +13,7 @@ final class CachedCount */ private ?int $count = null; - public function __construct(private ?Countable $collection) - { - } + public function __construct(private ?Countable $collection) {} /** * @psalm-internal Yiisoft\Data\Cycle\Reader diff --git a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php index 8109ca8..5cc3630 100644 --- a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php @@ -29,9 +29,9 @@ protected function prepareValue(string|Stringable $value, LikeMode $mode): strin $value = strtr((string) $value, $this->escapingReplacements); return match ($mode) { - LikeMode::Contains => '%'.$value.'%', - LikeMode::StartsWith => $value.'%', - LikeMode::EndsWith => '%'.$value, + LikeMode::Contains => '%' . $value . '%', + LikeMode::StartsWith => $value . '%', + LikeMode::EndsWith => '%' . $value, }; } } diff --git a/src/Reader/FilterHandler/NotHandler.php b/src/Reader/FilterHandler/NotHandler.php index 457b198..0a9ca0a 100644 --- a/src/Reader/FilterHandler/NotHandler.php +++ b/src/Reader/FilterHandler/NotHandler.php @@ -62,13 +62,13 @@ private function convertFilter(FilterInterface $filter, int $notCount = 1): Filt return match ($filter::class) { AndX::class => new OrX( ...array_map( - static fn (FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), + static fn(FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), $filter->filters, ), ), OrX::class => new AndX( ...array_map( - static fn (FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), + static fn(FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), $filter->filters, ), ), diff --git a/src/Writer/EntityWriter.php b/src/Writer/EntityWriter.php index deb562c..c20df2e 100644 --- a/src/Writer/EntityWriter.php +++ b/src/Writer/EntityWriter.php @@ -11,9 +11,7 @@ final class EntityWriter implements DataWriterInterface { - public function __construct(private EntityManagerInterface $entityManager) - { - } + public function __construct(private EntityManagerInterface $entityManager) {} /** * @throws Throwable diff --git a/tests/Support/NotSupportedFilter.php b/tests/Support/NotSupportedFilter.php index d8622ba..d416e28 100644 --- a/tests/Support/NotSupportedFilter.php +++ b/tests/Support/NotSupportedFilter.php @@ -6,6 +6,4 @@ use Yiisoft\Data\Reader\FilterInterface; -final class NotSupportedFilter implements FilterInterface -{ -} +final class NotSupportedFilter implements FilterInterface {} diff --git a/tests/Support/StubFilter.php b/tests/Support/StubFilter.php index fd60b88..ba0d02f 100644 --- a/tests/Support/StubFilter.php +++ b/tests/Support/StubFilter.php @@ -6,6 +6,4 @@ use Yiisoft\Data\Reader\FilterInterface; -final class StubFilter implements FilterInterface -{ -} +final class StubFilter implements FilterInterface {} From 4edc5030bc123fae122c4f453504471fd7688f76 Mon Sep 17 00:00:00 2001 From: Ross Addison Date: Wed, 21 Jan 2026 20:16:46 +0000 Subject: [PATCH 07/17] Workflow Action Test 5 Actions/checkout v3 to v6: Potentially remove possible security vulnerabilities Avoid v3 deprecation in the future. --- .github/workflows/mssql.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/mssql.yml b/.github/workflows/mssql.yml index a706749..eeabdb1 100644 --- a/.github/workflows/mssql.yml +++ b/.github/workflows/mssql.yml @@ -62,7 +62,7 @@ jobs: sudo apt-get update sudo ACCEPT_EULA=Y apt-get install -y msodbcsql18 || sudo ACCEPT_EULA=Y apt-get install -y msodbcsql17 - name: Checkout - uses: actions/checkout@v4 + uses: actions/checkout@v6 - name: Create MS SQL Database run: docker exec -i mssql ${{ matrix.mssql.tools-path }}/bin/sqlcmd ${{ matrix.mssql.flag }} -S localhost -U SA -P 'YourStrong!Passw0rd' -Q 'CREATE DATABASE yiitest' - name: Install PHP with extensions From b79eba9c4afff24ef8c855ef06c02ab3579e0978 Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Wed, 21 Jan 2026 21:38:27 +0000 Subject: [PATCH 08/17] Apply fixes from StyleCI --- src/Reader/Cache/CachedCount.php | 4 +++- src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php | 6 +++--- src/Reader/FilterHandler/NotHandler.php | 4 ++-- src/Writer/EntityWriter.php | 4 +++- tests/Support/NotSupportedFilter.php | 4 +++- tests/Support/StubFilter.php | 4 +++- 6 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/Reader/Cache/CachedCount.php b/src/Reader/Cache/CachedCount.php index e4b3e2c..429561e 100644 --- a/src/Reader/Cache/CachedCount.php +++ b/src/Reader/Cache/CachedCount.php @@ -13,7 +13,9 @@ final class CachedCount */ private ?int $count = null; - public function __construct(private ?Countable $collection) {} + public function __construct(private ?Countable $collection) + { + } /** * @psalm-internal Yiisoft\Data\Cycle\Reader diff --git a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php index 5cc3630..8109ca8 100644 --- a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php @@ -29,9 +29,9 @@ protected function prepareValue(string|Stringable $value, LikeMode $mode): strin $value = strtr((string) $value, $this->escapingReplacements); return match ($mode) { - LikeMode::Contains => '%' . $value . '%', - LikeMode::StartsWith => $value . '%', - LikeMode::EndsWith => '%' . $value, + LikeMode::Contains => '%'.$value.'%', + LikeMode::StartsWith => $value.'%', + LikeMode::EndsWith => '%'.$value, }; } } diff --git a/src/Reader/FilterHandler/NotHandler.php b/src/Reader/FilterHandler/NotHandler.php index 0a9ca0a..457b198 100644 --- a/src/Reader/FilterHandler/NotHandler.php +++ b/src/Reader/FilterHandler/NotHandler.php @@ -62,13 +62,13 @@ private function convertFilter(FilterInterface $filter, int $notCount = 1): Filt return match ($filter::class) { AndX::class => new OrX( ...array_map( - static fn(FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), + static fn (FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), $filter->filters, ), ), OrX::class => new AndX( ...array_map( - static fn(FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), + static fn (FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), $filter->filters, ), ), diff --git a/src/Writer/EntityWriter.php b/src/Writer/EntityWriter.php index c20df2e..deb562c 100644 --- a/src/Writer/EntityWriter.php +++ b/src/Writer/EntityWriter.php @@ -11,7 +11,9 @@ final class EntityWriter implements DataWriterInterface { - public function __construct(private EntityManagerInterface $entityManager) {} + public function __construct(private EntityManagerInterface $entityManager) + { + } /** * @throws Throwable diff --git a/tests/Support/NotSupportedFilter.php b/tests/Support/NotSupportedFilter.php index d416e28..d8622ba 100644 --- a/tests/Support/NotSupportedFilter.php +++ b/tests/Support/NotSupportedFilter.php @@ -6,4 +6,6 @@ use Yiisoft\Data\Reader\FilterInterface; -final class NotSupportedFilter implements FilterInterface {} +final class NotSupportedFilter implements FilterInterface +{ +} diff --git a/tests/Support/StubFilter.php b/tests/Support/StubFilter.php index ba0d02f..fd60b88 100644 --- a/tests/Support/StubFilter.php +++ b/tests/Support/StubFilter.php @@ -6,4 +6,6 @@ use Yiisoft\Data\Reader\FilterInterface; -final class StubFilter implements FilterInterface {} +final class StubFilter implements FilterInterface +{ +} From c72da46d2b00191b2405befc0562708511959c70 Mon Sep 17 00:00:00 2001 From: rossaddison <8538339+rossaddison@users.noreply.github.com> Date: Wed, 21 Jan 2026 21:46:47 +0000 Subject: [PATCH 09/17] Apply PHP CS Fixer and Rector changes (CI) --- src/Reader/Cache/CachedCount.php | 4 +--- src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php | 6 +++--- src/Reader/FilterHandler/NotHandler.php | 4 ++-- src/Writer/EntityWriter.php | 4 +--- tests/Support/NotSupportedFilter.php | 4 +--- tests/Support/StubFilter.php | 4 +--- 6 files changed, 9 insertions(+), 17 deletions(-) diff --git a/src/Reader/Cache/CachedCount.php b/src/Reader/Cache/CachedCount.php index 429561e..e4b3e2c 100644 --- a/src/Reader/Cache/CachedCount.php +++ b/src/Reader/Cache/CachedCount.php @@ -13,9 +13,7 @@ final class CachedCount */ private ?int $count = null; - public function __construct(private ?Countable $collection) - { - } + public function __construct(private ?Countable $collection) {} /** * @psalm-internal Yiisoft\Data\Cycle\Reader diff --git a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php index 8109ca8..5cc3630 100644 --- a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php @@ -29,9 +29,9 @@ protected function prepareValue(string|Stringable $value, LikeMode $mode): strin $value = strtr((string) $value, $this->escapingReplacements); return match ($mode) { - LikeMode::Contains => '%'.$value.'%', - LikeMode::StartsWith => $value.'%', - LikeMode::EndsWith => '%'.$value, + LikeMode::Contains => '%' . $value . '%', + LikeMode::StartsWith => $value . '%', + LikeMode::EndsWith => '%' . $value, }; } } diff --git a/src/Reader/FilterHandler/NotHandler.php b/src/Reader/FilterHandler/NotHandler.php index 457b198..0a9ca0a 100644 --- a/src/Reader/FilterHandler/NotHandler.php +++ b/src/Reader/FilterHandler/NotHandler.php @@ -62,13 +62,13 @@ private function convertFilter(FilterInterface $filter, int $notCount = 1): Filt return match ($filter::class) { AndX::class => new OrX( ...array_map( - static fn (FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), + static fn(FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), $filter->filters, ), ), OrX::class => new AndX( ...array_map( - static fn (FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), + static fn(FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), $filter->filters, ), ), diff --git a/src/Writer/EntityWriter.php b/src/Writer/EntityWriter.php index deb562c..c20df2e 100644 --- a/src/Writer/EntityWriter.php +++ b/src/Writer/EntityWriter.php @@ -11,9 +11,7 @@ final class EntityWriter implements DataWriterInterface { - public function __construct(private EntityManagerInterface $entityManager) - { - } + public function __construct(private EntityManagerInterface $entityManager) {} /** * @throws Throwable diff --git a/tests/Support/NotSupportedFilter.php b/tests/Support/NotSupportedFilter.php index d8622ba..d416e28 100644 --- a/tests/Support/NotSupportedFilter.php +++ b/tests/Support/NotSupportedFilter.php @@ -6,6 +6,4 @@ use Yiisoft\Data\Reader\FilterInterface; -final class NotSupportedFilter implements FilterInterface -{ -} +final class NotSupportedFilter implements FilterInterface {} diff --git a/tests/Support/StubFilter.php b/tests/Support/StubFilter.php index fd60b88..ba0d02f 100644 --- a/tests/Support/StubFilter.php +++ b/tests/Support/StubFilter.php @@ -6,6 +6,4 @@ use Yiisoft\Data\Reader\FilterInterface; -final class StubFilter implements FilterInterface -{ -} +final class StubFilter implements FilterInterface {} From e73d038b688e83e93499fd3642689ac69bbd561d Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Wed, 21 Jan 2026 21:52:20 +0000 Subject: [PATCH 10/17] Apply fixes from StyleCI --- src/Reader/Cache/CachedCount.php | 4 +++- src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php | 6 +++--- src/Reader/FilterHandler/NotHandler.php | 4 ++-- src/Writer/EntityWriter.php | 4 +++- tests/Support/NotSupportedFilter.php | 4 +++- tests/Support/StubFilter.php | 4 +++- 6 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/Reader/Cache/CachedCount.php b/src/Reader/Cache/CachedCount.php index e4b3e2c..429561e 100644 --- a/src/Reader/Cache/CachedCount.php +++ b/src/Reader/Cache/CachedCount.php @@ -13,7 +13,9 @@ final class CachedCount */ private ?int $count = null; - public function __construct(private ?Countable $collection) {} + public function __construct(private ?Countable $collection) + { + } /** * @psalm-internal Yiisoft\Data\Cycle\Reader diff --git a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php index 5cc3630..8109ca8 100644 --- a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php @@ -29,9 +29,9 @@ protected function prepareValue(string|Stringable $value, LikeMode $mode): strin $value = strtr((string) $value, $this->escapingReplacements); return match ($mode) { - LikeMode::Contains => '%' . $value . '%', - LikeMode::StartsWith => $value . '%', - LikeMode::EndsWith => '%' . $value, + LikeMode::Contains => '%'.$value.'%', + LikeMode::StartsWith => $value.'%', + LikeMode::EndsWith => '%'.$value, }; } } diff --git a/src/Reader/FilterHandler/NotHandler.php b/src/Reader/FilterHandler/NotHandler.php index 0a9ca0a..457b198 100644 --- a/src/Reader/FilterHandler/NotHandler.php +++ b/src/Reader/FilterHandler/NotHandler.php @@ -62,13 +62,13 @@ private function convertFilter(FilterInterface $filter, int $notCount = 1): Filt return match ($filter::class) { AndX::class => new OrX( ...array_map( - static fn(FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), + static fn (FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), $filter->filters, ), ), OrX::class => new AndX( ...array_map( - static fn(FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), + static fn (FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), $filter->filters, ), ), diff --git a/src/Writer/EntityWriter.php b/src/Writer/EntityWriter.php index c20df2e..deb562c 100644 --- a/src/Writer/EntityWriter.php +++ b/src/Writer/EntityWriter.php @@ -11,7 +11,9 @@ final class EntityWriter implements DataWriterInterface { - public function __construct(private EntityManagerInterface $entityManager) {} + public function __construct(private EntityManagerInterface $entityManager) + { + } /** * @throws Throwable diff --git a/tests/Support/NotSupportedFilter.php b/tests/Support/NotSupportedFilter.php index d416e28..d8622ba 100644 --- a/tests/Support/NotSupportedFilter.php +++ b/tests/Support/NotSupportedFilter.php @@ -6,4 +6,6 @@ use Yiisoft\Data\Reader\FilterInterface; -final class NotSupportedFilter implements FilterInterface {} +final class NotSupportedFilter implements FilterInterface +{ +} diff --git a/tests/Support/StubFilter.php b/tests/Support/StubFilter.php index ba0d02f..fd60b88 100644 --- a/tests/Support/StubFilter.php +++ b/tests/Support/StubFilter.php @@ -6,4 +6,6 @@ use Yiisoft\Data\Reader\FilterInterface; -final class StubFilter implements FilterInterface {} +final class StubFilter implements FilterInterface +{ +} From a326d2e0cf9ec9181ee8e1765d28a8f9de239205 Mon Sep 17 00:00:00 2001 From: rossaddison <8538339+rossaddison@users.noreply.github.com> Date: Wed, 21 Jan 2026 21:59:25 +0000 Subject: [PATCH 11/17] Apply PHP CS Fixer and Rector changes (CI) --- src/Reader/Cache/CachedCount.php | 4 +--- src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php | 6 +++--- src/Reader/FilterHandler/NotHandler.php | 4 ++-- src/Writer/EntityWriter.php | 4 +--- tests/Support/NotSupportedFilter.php | 4 +--- tests/Support/StubFilter.php | 4 +--- 6 files changed, 9 insertions(+), 17 deletions(-) diff --git a/src/Reader/Cache/CachedCount.php b/src/Reader/Cache/CachedCount.php index 429561e..e4b3e2c 100644 --- a/src/Reader/Cache/CachedCount.php +++ b/src/Reader/Cache/CachedCount.php @@ -13,9 +13,7 @@ final class CachedCount */ private ?int $count = null; - public function __construct(private ?Countable $collection) - { - } + public function __construct(private ?Countable $collection) {} /** * @psalm-internal Yiisoft\Data\Cycle\Reader diff --git a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php index 8109ca8..5cc3630 100644 --- a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php @@ -29,9 +29,9 @@ protected function prepareValue(string|Stringable $value, LikeMode $mode): strin $value = strtr((string) $value, $this->escapingReplacements); return match ($mode) { - LikeMode::Contains => '%'.$value.'%', - LikeMode::StartsWith => $value.'%', - LikeMode::EndsWith => '%'.$value, + LikeMode::Contains => '%' . $value . '%', + LikeMode::StartsWith => $value . '%', + LikeMode::EndsWith => '%' . $value, }; } } diff --git a/src/Reader/FilterHandler/NotHandler.php b/src/Reader/FilterHandler/NotHandler.php index 457b198..0a9ca0a 100644 --- a/src/Reader/FilterHandler/NotHandler.php +++ b/src/Reader/FilterHandler/NotHandler.php @@ -62,13 +62,13 @@ private function convertFilter(FilterInterface $filter, int $notCount = 1): Filt return match ($filter::class) { AndX::class => new OrX( ...array_map( - static fn (FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), + static fn(FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), $filter->filters, ), ), OrX::class => new AndX( ...array_map( - static fn (FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), + static fn(FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), $filter->filters, ), ), diff --git a/src/Writer/EntityWriter.php b/src/Writer/EntityWriter.php index deb562c..c20df2e 100644 --- a/src/Writer/EntityWriter.php +++ b/src/Writer/EntityWriter.php @@ -11,9 +11,7 @@ final class EntityWriter implements DataWriterInterface { - public function __construct(private EntityManagerInterface $entityManager) - { - } + public function __construct(private EntityManagerInterface $entityManager) {} /** * @throws Throwable diff --git a/tests/Support/NotSupportedFilter.php b/tests/Support/NotSupportedFilter.php index d8622ba..d416e28 100644 --- a/tests/Support/NotSupportedFilter.php +++ b/tests/Support/NotSupportedFilter.php @@ -6,6 +6,4 @@ use Yiisoft\Data\Reader\FilterInterface; -final class NotSupportedFilter implements FilterInterface -{ -} +final class NotSupportedFilter implements FilterInterface {} diff --git a/tests/Support/StubFilter.php b/tests/Support/StubFilter.php index fd60b88..ba0d02f 100644 --- a/tests/Support/StubFilter.php +++ b/tests/Support/StubFilter.php @@ -6,6 +6,4 @@ use Yiisoft\Data\Reader\FilterInterface; -final class StubFilter implements FilterInterface -{ -} +final class StubFilter implements FilterInterface {} From 64005bbf36e7e0559b8303de5e48ff0eefd96169 Mon Sep 17 00:00:00 2001 From: Ross Addison Date: Wed, 21 Jan 2026 22:35:16 +0000 Subject: [PATCH 12/17] Workflow Action Test 6 - 8.5 included in mssql Include php 8.5 in mssql.yml --- .github/workflows/mssql.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/mssql.yml b/.github/workflows/mssql.yml index eeabdb1..28dbbc7 100644 --- a/.github/workflows/mssql.yml +++ b/.github/workflows/mssql.yml @@ -31,6 +31,7 @@ jobs: - 8.2 - 8.3 - 8.4 + - 8.5 mssql: - server: 2017-latest odbc-version: 17 From 45e24a9c2a247e2afde086e5066802fbc00f465e Mon Sep 17 00:00:00 2001 From: StyleCI Bot Date: Wed, 21 Jan 2026 22:36:31 +0000 Subject: [PATCH 13/17] Apply fixes from StyleCI --- src/Reader/Cache/CachedCount.php | 4 +++- src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php | 6 +++--- src/Reader/FilterHandler/NotHandler.php | 4 ++-- src/Writer/EntityWriter.php | 4 +++- tests/Support/NotSupportedFilter.php | 4 +++- tests/Support/StubFilter.php | 4 +++- 6 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/Reader/Cache/CachedCount.php b/src/Reader/Cache/CachedCount.php index e4b3e2c..429561e 100644 --- a/src/Reader/Cache/CachedCount.php +++ b/src/Reader/Cache/CachedCount.php @@ -13,7 +13,9 @@ final class CachedCount */ private ?int $count = null; - public function __construct(private ?Countable $collection) {} + public function __construct(private ?Countable $collection) + { + } /** * @psalm-internal Yiisoft\Data\Cycle\Reader diff --git a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php index 5cc3630..8109ca8 100644 --- a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php @@ -29,9 +29,9 @@ protected function prepareValue(string|Stringable $value, LikeMode $mode): strin $value = strtr((string) $value, $this->escapingReplacements); return match ($mode) { - LikeMode::Contains => '%' . $value . '%', - LikeMode::StartsWith => $value . '%', - LikeMode::EndsWith => '%' . $value, + LikeMode::Contains => '%'.$value.'%', + LikeMode::StartsWith => $value.'%', + LikeMode::EndsWith => '%'.$value, }; } } diff --git a/src/Reader/FilterHandler/NotHandler.php b/src/Reader/FilterHandler/NotHandler.php index 0a9ca0a..457b198 100644 --- a/src/Reader/FilterHandler/NotHandler.php +++ b/src/Reader/FilterHandler/NotHandler.php @@ -62,13 +62,13 @@ private function convertFilter(FilterInterface $filter, int $notCount = 1): Filt return match ($filter::class) { AndX::class => new OrX( ...array_map( - static fn(FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), + static fn (FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), $filter->filters, ), ), OrX::class => new AndX( ...array_map( - static fn(FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), + static fn (FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), $filter->filters, ), ), diff --git a/src/Writer/EntityWriter.php b/src/Writer/EntityWriter.php index c20df2e..deb562c 100644 --- a/src/Writer/EntityWriter.php +++ b/src/Writer/EntityWriter.php @@ -11,7 +11,9 @@ final class EntityWriter implements DataWriterInterface { - public function __construct(private EntityManagerInterface $entityManager) {} + public function __construct(private EntityManagerInterface $entityManager) + { + } /** * @throws Throwable diff --git a/tests/Support/NotSupportedFilter.php b/tests/Support/NotSupportedFilter.php index d416e28..d8622ba 100644 --- a/tests/Support/NotSupportedFilter.php +++ b/tests/Support/NotSupportedFilter.php @@ -6,4 +6,6 @@ use Yiisoft\Data\Reader\FilterInterface; -final class NotSupportedFilter implements FilterInterface {} +final class NotSupportedFilter implements FilterInterface +{ +} diff --git a/tests/Support/StubFilter.php b/tests/Support/StubFilter.php index ba0d02f..fd60b88 100644 --- a/tests/Support/StubFilter.php +++ b/tests/Support/StubFilter.php @@ -6,4 +6,6 @@ use Yiisoft\Data\Reader\FilterInterface; -final class StubFilter implements FilterInterface {} +final class StubFilter implements FilterInterface +{ +} From 3bfd059eeb96455f0a969a4a8af72af50ce670dd Mon Sep 17 00:00:00 2001 From: rossaddison <8538339+rossaddison@users.noreply.github.com> Date: Wed, 21 Jan 2026 22:49:56 +0000 Subject: [PATCH 14/17] Apply PHP CS Fixer and Rector changes (CI) --- src/Reader/Cache/CachedCount.php | 4 +--- src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php | 6 +++--- src/Reader/FilterHandler/NotHandler.php | 4 ++-- src/Writer/EntityWriter.php | 4 +--- tests/Support/NotSupportedFilter.php | 4 +--- tests/Support/StubFilter.php | 4 +--- 6 files changed, 9 insertions(+), 17 deletions(-) diff --git a/src/Reader/Cache/CachedCount.php b/src/Reader/Cache/CachedCount.php index 429561e..e4b3e2c 100644 --- a/src/Reader/Cache/CachedCount.php +++ b/src/Reader/Cache/CachedCount.php @@ -13,9 +13,7 @@ final class CachedCount */ private ?int $count = null; - public function __construct(private ?Countable $collection) - { - } + public function __construct(private ?Countable $collection) {} /** * @psalm-internal Yiisoft\Data\Cycle\Reader diff --git a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php index 8109ca8..5cc3630 100644 --- a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php @@ -29,9 +29,9 @@ protected function prepareValue(string|Stringable $value, LikeMode $mode): strin $value = strtr((string) $value, $this->escapingReplacements); return match ($mode) { - LikeMode::Contains => '%'.$value.'%', - LikeMode::StartsWith => $value.'%', - LikeMode::EndsWith => '%'.$value, + LikeMode::Contains => '%' . $value . '%', + LikeMode::StartsWith => $value . '%', + LikeMode::EndsWith => '%' . $value, }; } } diff --git a/src/Reader/FilterHandler/NotHandler.php b/src/Reader/FilterHandler/NotHandler.php index 457b198..0a9ca0a 100644 --- a/src/Reader/FilterHandler/NotHandler.php +++ b/src/Reader/FilterHandler/NotHandler.php @@ -62,13 +62,13 @@ private function convertFilter(FilterInterface $filter, int $notCount = 1): Filt return match ($filter::class) { AndX::class => new OrX( ...array_map( - static fn (FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), + static fn(FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), $filter->filters, ), ), OrX::class => new AndX( ...array_map( - static fn (FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), + static fn(FilterInterface $subFilter): FilterInterface => $handler->convertFilter($subFilter), $filter->filters, ), ), diff --git a/src/Writer/EntityWriter.php b/src/Writer/EntityWriter.php index deb562c..c20df2e 100644 --- a/src/Writer/EntityWriter.php +++ b/src/Writer/EntityWriter.php @@ -11,9 +11,7 @@ final class EntityWriter implements DataWriterInterface { - public function __construct(private EntityManagerInterface $entityManager) - { - } + public function __construct(private EntityManagerInterface $entityManager) {} /** * @throws Throwable diff --git a/tests/Support/NotSupportedFilter.php b/tests/Support/NotSupportedFilter.php index d8622ba..d416e28 100644 --- a/tests/Support/NotSupportedFilter.php +++ b/tests/Support/NotSupportedFilter.php @@ -6,6 +6,4 @@ use Yiisoft\Data\Reader\FilterInterface; -final class NotSupportedFilter implements FilterInterface -{ -} +final class NotSupportedFilter implements FilterInterface {} diff --git a/tests/Support/StubFilter.php b/tests/Support/StubFilter.php index fd60b88..ba0d02f 100644 --- a/tests/Support/StubFilter.php +++ b/tests/Support/StubFilter.php @@ -6,6 +6,4 @@ use Yiisoft\Data\Reader\FilterInterface; -final class StubFilter implements FilterInterface -{ -} +final class StubFilter implements FilterInterface {} From 6b2f2f32ff28d0cd96445951e7abdc9d89dc16be Mon Sep 17 00:00:00 2001 From: Ross Addison Date: Wed, 21 Jan 2026 23:15:45 +0000 Subject: [PATCH 15/17] Workflow Action Test 7 - Workflow Implications Update Readme to cater for similar future mssql and php difficulties. --- docs/guide/en/README.md | 1 + docs/guide/es/PHP-8.5-MSSQL.md | 131 +++++++++++++++++++++++++++++ docs/guide/es/README.md | 1 + docs/guide/pt-BR/PHP-8.5-MSSQL.md | 133 ++++++++++++++++++++++++++++++ docs/guide/pt-BR/README.md | 1 + docs/guide/ru/README.md | 1 + 6 files changed, 268 insertions(+) create mode 100644 docs/guide/es/PHP-8.5-MSSQL.md create mode 100644 docs/guide/pt-BR/PHP-8.5-MSSQL.md diff --git a/docs/guide/en/README.md b/docs/guide/en/README.md index e44a7ff..03a2469 100644 --- a/docs/guide/en/README.md +++ b/docs/guide/en/README.md @@ -2,3 +2,4 @@ - [EntityReader class](entity-reader.md) - [EntityWriter](entity-writer.md) +- [MSSQL Workflow Implications](PHP-8.5-MSSQL.md) diff --git a/docs/guide/es/PHP-8.5-MSSQL.md b/docs/guide/es/PHP-8.5-MSSQL.md new file mode 100644 index 0000000..8afca09 --- /dev/null +++ b/docs/guide/es/PHP-8.5-MSSQL.md @@ -0,0 +1,131 @@ +Implicaciones de PHP 8.5 para el Flujo de Trabajo de MSSQL (Fuente IA: Claude Sonnet 4.5 - prueba gratuita) +Resumen Ejecutivo +No agregue PHP 8.5 al flujo de trabajo de MSSQL todavía. El controlador pdo_sqlsrv actual (versión 5.12) no es compatible con PHP 8.5, y el flujo de trabajo fallará durante la instalación de extensiones de PHP. +Bloqueador Crítico: Incompatibilidad del Controlador +Situación Actual +La extensión pdo_sqlsrv 5.12.0 especificada en el flujo de trabajo no se compila con PHP 8.5.0 debido a cambios internos en la API de PHP. Esto significa que cualquier intento de agregar PHP 8.5 a la matriz de pruebas resultará en fallas inmediatas del flujo de trabajo. +Estado de Compatibilidad del Controlador +Versión de PHPCompatibilidad pdo_sqlsrv 5.128.1✅ Totalmente Compatible8.2✅ Totalmente Compatible8.3✅ Totalmente Compatible8.4⚠️ No Oficial/Limitado8.5❌ No Compatible +Qué Debe Suceder Primero +Antes de que PHP 8.5 pueda agregarse al flujo de trabajo: + +Microsoft debe lanzar una nueva versión del controlador pdo_sqlsrv (probablemente 5.13 o 6.0) +El nuevo controlador debe estar disponible a través de PECL para instalación mediante shivammathur/setup-php +La configuración de extensiones del flujo de trabajo debe actualizarse para hacer referencia a la nueva versión del controlador + +Expectativas de Cronograma +Basado en patrones históricos con versiones anteriores de PHP: + +Retraso esperado: 2-6 meses después del lanzamiento oficial de PHP 8.5 +Precedente de PHP 8.4: A finales de 2024/principios de 2025, PHP 8.4 todavía carece de soporte oficial completo del controlador MSSQL +Recomendación: Monitorear el repositorio msphpsql de Microsoft para anuncios + +Plan de Acción Recomendado +Fase 1: Monitoreo (Actual) +Monitorear estos recursos para actualizaciones: + +GitHub msphpsql de Microsoft - Repositorio oficial del controlador +Página PECL pdo_sqlsrv - Anuncios de lanzamiento +Notas de lanzamiento de PHP 8.5 y matrices de compatibilidad + +Fase 2: Pruebas Tempranas (Cuando el Controlador Esté Disponible) +Una vez que se lance un controlador compatible: +yamlstrategy: + matrix: + php: + - 8.1 + - 8.2 + - 8.3 + - 8.4 + - 8.5 +Actualizar la configuración de extensiones: +yamlenv: + extensions: pdo, pdo_sqlsrv-5.13 # O la nueva versión que sea +Considerar usar continue-on-error: true inicialmente para trabajos de PHP 8.5: +yaml- name: Run tests with phpunit + continue-on-error: ${{ matrix.php == '8.5' }} + run: vendor/bin/phpunit --testsuite=Mssql --coverage-clover=coverage.xml + --colors=always +``` + +### Fase 3: Integración Completa + +Después de confirmar la estabilidad: + +- Eliminar la bandera `continue-on-error` +- Hacer de PHP 8.5 una prueba requerida en el pipeline de CI + +## Puntos de Falla Potenciales + +Si agrega PHP 8.5 prematuramente, espere fallas en: + +1. **Paso de Instalación de Extensión** +``` + shivammathur/setup-php@v2 +Error: No se puede instalar pdo_sqlsrv-5.12 para PHP 8.5 + +Errores de Compilación +El controlador puede intentar compilar pero fallar debido a incompatibilidades de API +Errores en Tiempo de Ejecución +Incluso si la instalación tiene éxito, las incompatibilidades en tiempo de ejecución pueden causar fallas en las pruebas + +Características de PHP 8.5 a Tener en Cuenta +Mientras espera el soporte del controlador, tenga en cuenta estos cambios de PHP 8.5 que podrían impactar su código base: + +Operador pipe: Nueva sintaxis de programación funcional +Sintaxis clone with: Clonación de objetos mejorada +Deprecaciones: Conversiones de tipo escalar no canónicas +Otras mejoras: Hooks de propiedades, visibilidad asimétrica + +Estos cambios probablemente no afectarán directamente las operaciones de base de datos, pero pueden impactar el código de la aplicación. +Estrategia de Pruebas +Cuando el soporte del controlador esté disponible: + +Crear una rama de prueba separada con PHP 8.5 agregado a la matriz +Ejecutar el conjunto completo de pruebas contra todas las versiones de MSSQL (2017, 2019, 2022) +Verificar advertencias de deprecación en la salida de pruebas +Verificar compatibilidad con todas las versiones de PHP en la matriz +Monitorear regresiones de rendimiento + +Estado Actual del Flujo de Trabajo +El flujo de trabajo actualmente prueba: + +Versiones de PHP: 8.1, 8.2, 8.3, 8.4 +Versiones de MSSQL: 2017 (ODBC 17), 2019 (ODBC 18), 2022 (ODBC 18) +Versión del controlador: pdo_sqlsrv-5.12 + +Esta configuración es estable y debe permanecer sin cambios hasta que se confirme la compatibilidad del controlador. +Conclusión +Acción Requerida: Ninguna en este momento. Continuar monitoreando para actualizaciones del controlador pdo_sqlsrv. +No Hacer: Agregar PHP 8.5 a la matriz de pruebas hasta que Microsoft lance una versión compatible del controlador. +Próximos Pasos: Vigilar el repositorio GitHub msphpsql de Microsoft para anuncios de lanzamiento y actualizar este documento cuando nueva información esté disponible. + +Última Actualización: 21 de enero de 2026 +Estado: Esperando soporte del controlador pdo_sqlsrv para PHP 8.5 +¿También se puede actualizar Actions checkout a la versión 6? +Novedades en v6 +La versión 6 incluye soporte para Node.js 24 y persiste credenciales en un archivo PHP separado, junto con mejoras en el soporte de worktree. +Ruta de Actualización +Puede actualizar de manera segura de v3 → v4 → v5 → v6, o saltar directamente a v6. La acción mantiene compatibilidad hacia atrás para uso básico. +Flujo de Trabajo Actualizado +Aquí está su flujo de trabajo con la acción checkout actualizada a v6: +yaml- name: Checkout +uses: actions/checkout@v4 # Puede actualizarse a @v6 +Debe convertirse en: +yaml- name: Checkout +uses: actions/checkout@v6 +¿Debería Actualizar? +Sí, debería actualizar por varias razones: +Actualizaciones de seguridad - Las versiones más nuevas incluyen parches de seguridad +Soporte para Node.js 24 - Mejor rendimiento y compatibilidad +Corrección de errores - Varias mejoras y mejoras de estabilidad +Preparación para el futuro - v3 es bastante antigua y eventualmente puede quedar obsoleta +Consideraciones de Migración +La actualización de v3 a v6 debería ser sin problemas para su caso de uso, ya que está usando el checkout básico sin parámetros especiales. +Sin embargo, es una buena práctica: + +Probar el flujo de trabajo en una rama de características primero +Revisar el registro de cambios para cualquier cambio importante +Considerar fijar a un SHA de commit específico para máxima estabilidad en producción (por ejemplo, actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8) + +¡Para su flujo de trabajo, la simple actualización de versión está perfectamente bien y es recomendada! diff --git a/docs/guide/es/README.md b/docs/guide/es/README.md index a6bf01d..9a939a0 100644 --- a/docs/guide/es/README.md +++ b/docs/guide/es/README.md @@ -2,3 +2,4 @@ - [EntityReader](entity-reader.md) - [EntityWriter](entity-writer.md) +- [MSSQL Workflow Implications](PHP-8.5-MSSQL.md) diff --git a/docs/guide/pt-BR/PHP-8.5-MSSQL.md b/docs/guide/pt-BR/PHP-8.5-MSSQL.md new file mode 100644 index 0000000..0725994 --- /dev/null +++ b/docs/guide/pt-BR/PHP-8.5-MSSQL.md @@ -0,0 +1,133 @@ +Implicações do PHP 8.5 para o Fluxo de Trabalho MSSQL (Fonte IA: Claude Sonnet 4.5 - teste gratuito) +Resumo Executivo +Não adicione o PHP 8.5 ao fluxo de trabalho MSSQL ainda. O driver pdo_sqlsrv atual (versão 5.12) não é compatível com PHP 8.5, e o fluxo de trabalho falhará durante a instalação de extensões do PHP. +Bloqueador Crítico: Incompatibilidade do Driver +Situação Atual +A extensão pdo_sqlsrv 5.12.0 especificada no fluxo de trabalho não compila com PHP 8.5.0 devido a mudanças internas na API do PHP. Isso significa que qualquer tentativa de adicionar PHP 8.5 à matriz de testes resultará em falhas imediatas do fluxo de trabalho. +Status de Compatibilidade do Driver +Versão do PHPCompatibilidade pdo_sqlsrv 5.128.1✅ Totalmente Compatível8.2✅ Totalmente Compatível8.3✅ Totalmente Compatível8.4⚠️ Não Oficial/Limitado8.5❌ Não Compatível +O Que Precisa Acontecer Primeiro +Antes que o PHP 8.5 possa ser adicionado ao fluxo de trabalho: + +A Microsoft deve lançar uma nova versão do driver pdo_sqlsrv (provavelmente 5.13 ou 6.0) +O novo driver deve estar disponível via PECL para instalação através do shivammathur/setup-php +A configuração de extensões do fluxo de trabalho deve ser atualizada para referenciar a nova versão do driver + +Expectativas de Cronograma +Baseado em padrões históricos com versões anteriores do PHP: + +Atraso esperado: 2-6 meses após o lançamento oficial do PHP 8.5 +Precedente do PHP 8.4: No final de 2024/início de 2025, o PHP 8.4 ainda não possui suporte oficial completo do driver MSSQL +Recomendação: Monitorar o repositório msphpsql da Microsoft para anúncios + +Plano de Ação Recomendado +Fase 1: Monitoramento (Atual) +Monitorar estes recursos para atualizações: + +GitHub msphpsql da Microsoft - Repositório oficial do driver +Página PECL pdo_sqlsrv - Anúncios de lançamento +Notas de lançamento do PHP 8.5 e matrizes de compatibilidade + +Fase 2: Testes Iniciais (Quando o Driver Estiver Disponível) +Uma vez que um driver compatível seja lançado: +yamlstrategy: + matrix: + php: + - 8.1 + - 8.2 + - 8.3 + - 8.4 + - 8.5 +Atualizar a configuração de extensões: +yamlenv: + extensions: pdo, pdo_sqlsrv-5.13 # Ou qualquer que seja a nova versão +Considerar usar continue-on-error: true inicialmente para jobs do PHP 8.5: +yaml- name: Run tests with phpunit + continue-on-error: ${{ matrix.php == '8.5' }} + run: vendor/bin/phpunit --testsuite=Mssql --coverage-clover=coverage.xml + --colors=always +``` + +### Fase 3: Integração Completa + +Após confirmar a estabilidade: + +- Remover a flag `continue-on-error` +- Tornar o PHP 8.5 um teste obrigatório no pipeline de CI + +## Pontos de Falha Potenciais + +Se você adicionar o PHP 8.5 prematuramente, espere falhas em: + +1. **Etapa de Instalação de Extensão** +``` + shivammathur/setup-php@v2 +Erro: Não é possível instalar pdo_sqlsrv-5.12 para PHP 8.5 + +Erros de Compilação +O driver pode tentar compilar, mas falhar devido a incompatibilidades de API +Erros em Tempo de Execução +Mesmo que a instalação seja bem-sucedida, incompatibilidades em tempo de execução podem causar falhas nos testes + +Recursos do PHP 8.5 a Serem Observados +Enquanto aguarda o suporte do driver, observe estas mudanças do PHP 8.5 que podem impactar sua base de código: + +Operador pipe: Nova sintaxe de programação funcional +Sintaxe clone with: Clonagem de objetos aprimorada +Depreciações: Conversões de tipo escalar não canônicas +Outras melhorias: Hooks de propriedades, visibilidade assimétrica + +Essas mudanças provavelmente não afetarão diretamente as operações de banco de dados, mas podem impactar o código da aplicação. +Estratégia de Testes +Quando o suporte do driver estiver disponível: + +Criar um branch de teste separado com PHP 8.5 adicionado à matriz +Executar a suíte completa de testes contra todas as versões do MSSQL (2017, 2019, 2022) +Verificar avisos de depreciação na saída dos testes +Verificar compatibilidade com todas as versões do PHP na matriz +Monitorar regressões de desempenho + +Status Atual do Fluxo de Trabalho +O fluxo de trabalho atualmente testa: + +Versões do PHP: 8.1, 8.2, 8.3, 8.4 +Versões do MSSQL: 2017 (ODBC 17), 2019 (ODBC 18), 2022 (ODBC 18) +Versão do driver: pdo_sqlsrv-5.12 + +Esta configuração é estável e deve permanecer inalterada até que a compatibilidade do driver seja confirmada. +Conclusão +Ação Necessária: Nenhuma neste momento. Continuar monitorando para atualizações do driver pdo_sqlsrv. +Não Fazer: Adicionar PHP 8.5 à matriz de testes até que a Microsoft lance uma versão compatível do driver. +Próximos Passos: Acompanhar o repositório GitHub msphpsql da Microsoft para anúncios de lançamento e atualizar este documento quando novas informações estiverem disponíveis. + +Última Atualização: 21 de janeiro de 2026 +Status: Aguardando suporte do driver pdo_sqlsrv para PHP 8.5 +O Actions checkout também pode ser atualizado para a versão 6? +Novidades na v6 +A versão 6 inclui suporte ao Node.js 24 e persiste credenciais em um arquivo PHP separado, juntamente com melhorias no suporte a worktree. +Caminho de Atualização +Você pode atualizar com segurança de v3 → v4 → v5 → v6, ou pular diretamente para v6. A action mantém compatibilidade retroativa para uso básico. +Fluxo de Trabalho Atualizado +Aqui está seu fluxo de trabalho com a action checkout atualizada para v6: +yaml- name: Checkout +uses: actions/checkout@v4 # Pode ser atualizado para @v6 +Deve se tornar: +yaml- name: Checkout +uses: actions/checkout@v6 +Você Deveria Atualizar? +Sim, você deveria atualizar por várias razões: +Atualizações de segurança - Versões mais novas incluem patches de segurança +Suporte ao Node.js 24 - Melhor desempenho e compatibilidade +Correções de bugs - Várias melhorias e aprimoramentos de estabilidade +Preparação para o futuro - v3 é bastante antiga e pode eventualmente ser descontinuada +Considerações de Migração +A atualização de v3 para v6 deve ser tranquila para o seu caso de uso, já que você está usando o checkout básico sem parâmetros especiais. +No entanto, é uma boa prática: + +Testar o fluxo de trabalho em um branch de feature primeiro +Revisar o changelog para quaisquer mudanças disruptivas +Considerar fixar em um SHA de commit específico para máxima estabilidade em produção (por exemplo, actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8) + +Para o seu fluxo de trabalho, a simples atualização de versão está perfeitamente adequada e é recomendada! + +Se você precisar do arquivo YAML completo e corrigido do fluxo de trabalho, por favor compartilhe seu arquivo de fluxo de trabalho atual e fornecerei a versão totalmente corrigida com todas as correções aplicadas.Claude is AI and can make mistakes. Please double-check responses. diff --git a/docs/guide/pt-BR/README.md b/docs/guide/pt-BR/README.md index a6bf01d..9a939a0 100644 --- a/docs/guide/pt-BR/README.md +++ b/docs/guide/pt-BR/README.md @@ -2,3 +2,4 @@ - [EntityReader](entity-reader.md) - [EntityWriter](entity-writer.md) +- [MSSQL Workflow Implications](PHP-8.5-MSSQL.md) diff --git a/docs/guide/ru/README.md b/docs/guide/ru/README.md index a6bf01d..9a939a0 100644 --- a/docs/guide/ru/README.md +++ b/docs/guide/ru/README.md @@ -2,3 +2,4 @@ - [EntityReader](entity-reader.md) - [EntityWriter](entity-writer.md) +- [MSSQL Workflow Implications](PHP-8.5-MSSQL.md) From 18063c71953b059a93b842d4c380846fd4edb01c Mon Sep 17 00:00:00 2001 From: Ross Addison Date: Tue, 27 Jan 2026 09:17:46 +0000 Subject: [PATCH 16/17] Restore Original Style The following style changes appear to have altered the code coverage so I am reverting them. --- src/Reader/FilterHandler/AllHandler.php | 2 +- src/Reader/FilterHandler/AndXHandler.php | 2 +- src/Reader/FilterHandler/BetweenHandler.php | 4 ++-- src/Reader/FilterHandler/EqualsHandler.php | 2 +- src/Reader/FilterHandler/EqualsNullHandler.php | 2 +- src/Reader/FilterHandler/GreaterThanHandler.php | 2 +- .../FilterHandler/GreaterThanOrEqualHandler.php | 2 +- src/Reader/FilterHandler/InHandler.php | 2 +- src/Reader/FilterHandler/LessThanHandler.php | 2 +- src/Reader/FilterHandler/LessThanOrEqualHandler.php | 2 +- .../FilterHandler/LikeHandler/BaseLikeHandler.php | 11 +++++------ .../LikeHandler/LikeHandlerFactory.php | 8 ++++---- .../FilterHandler/LikeHandler/MysqlLikeHandler.php | 3 ++- .../LikeHandler/PostgresLikeHandler.php | 3 ++- .../LikeHandler/SqlServerLikeHandler.php | 3 ++- .../FilterHandler/LikeHandler/SqliteLikeHandler.php | 3 ++- src/Reader/FilterHandler/NoneHandler.php | 2 +- src/Reader/FilterHandler/NotHandler.php | 13 +++++++------ src/Reader/FilterHandler/OrXHandler.php | 2 +- 19 files changed, 37 insertions(+), 33 deletions(-) diff --git a/src/Reader/FilterHandler/AllHandler.php b/src/Reader/FilterHandler/AllHandler.php index e7e51ed..e7b24c4 100644 --- a/src/Reader/FilterHandler/AllHandler.php +++ b/src/Reader/FilterHandler/AllHandler.php @@ -7,10 +7,10 @@ use Cycle\Database\Injection\Expression; use Cycle\Database\Query\SelectQuery; use Cycle\ORM\Select\QueryBuilder; -use Override; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\All; use Yiisoft\Data\Reader\FilterInterface; +use Override; final class AllHandler implements QueryBuilderFilterHandler { diff --git a/src/Reader/FilterHandler/AndXHandler.php b/src/Reader/FilterHandler/AndXHandler.php index a4337b7..6dfcbfe 100644 --- a/src/Reader/FilterHandler/AndXHandler.php +++ b/src/Reader/FilterHandler/AndXHandler.php @@ -6,11 +6,11 @@ use Cycle\Database\Query\SelectQuery; use Cycle\ORM\Select\QueryBuilder; -use Override; use Yiisoft\Data\Cycle\Exception\NotSupportedFilterException; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\AndX; use Yiisoft\Data\Reader\FilterInterface; +use Override; final class AndXHandler implements QueryBuilderFilterHandler { diff --git a/src/Reader/FilterHandler/BetweenHandler.php b/src/Reader/FilterHandler/BetweenHandler.php index a02305d..a2361e5 100644 --- a/src/Reader/FilterHandler/BetweenHandler.php +++ b/src/Reader/FilterHandler/BetweenHandler.php @@ -4,10 +4,10 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler; -use Override; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\Between; use Yiisoft\Data\Reader\FilterInterface; +use Override; final class BetweenHandler implements QueryBuilderFilterHandler { @@ -20,7 +20,7 @@ public function getFilterClass(): string #[Override] public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { - /** @var Between $filter */ + /** @var Between $filter */ return [$filter->field, 'between', $filter->minValue, $filter->maxValue]; } diff --git a/src/Reader/FilterHandler/EqualsHandler.php b/src/Reader/FilterHandler/EqualsHandler.php index 65e66c9..1cc1229 100644 --- a/src/Reader/FilterHandler/EqualsHandler.php +++ b/src/Reader/FilterHandler/EqualsHandler.php @@ -4,10 +4,10 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler; -use Override; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\Equals; use Yiisoft\Data\Reader\FilterInterface; +use Override; final class EqualsHandler implements QueryBuilderFilterHandler { diff --git a/src/Reader/FilterHandler/EqualsNullHandler.php b/src/Reader/FilterHandler/EqualsNullHandler.php index 215d7ba..fd9059d 100644 --- a/src/Reader/FilterHandler/EqualsNullHandler.php +++ b/src/Reader/FilterHandler/EqualsNullHandler.php @@ -4,10 +4,10 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler; -use Override; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\EqualsNull; use Yiisoft\Data\Reader\FilterInterface; +use Override; final class EqualsNullHandler implements QueryBuilderFilterHandler { diff --git a/src/Reader/FilterHandler/GreaterThanHandler.php b/src/Reader/FilterHandler/GreaterThanHandler.php index cefdf13..0fc85e4 100644 --- a/src/Reader/FilterHandler/GreaterThanHandler.php +++ b/src/Reader/FilterHandler/GreaterThanHandler.php @@ -4,10 +4,10 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler; -use Override; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\GreaterThan; use Yiisoft\Data\Reader\FilterInterface; +use Override; final class GreaterThanHandler implements QueryBuilderFilterHandler { diff --git a/src/Reader/FilterHandler/GreaterThanOrEqualHandler.php b/src/Reader/FilterHandler/GreaterThanOrEqualHandler.php index b64855e..22abdb6 100644 --- a/src/Reader/FilterHandler/GreaterThanOrEqualHandler.php +++ b/src/Reader/FilterHandler/GreaterThanOrEqualHandler.php @@ -4,10 +4,10 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler; -use Override; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\GreaterThanOrEqual; use Yiisoft\Data\Reader\FilterInterface; +use Override; final class GreaterThanOrEqualHandler implements QueryBuilderFilterHandler { diff --git a/src/Reader/FilterHandler/InHandler.php b/src/Reader/FilterHandler/InHandler.php index 18b7b70..fd521d8 100644 --- a/src/Reader/FilterHandler/InHandler.php +++ b/src/Reader/FilterHandler/InHandler.php @@ -5,10 +5,10 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler; use Cycle\Database\Injection\Parameter; -use Override; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\In; use Yiisoft\Data\Reader\FilterInterface; +use Override; final class InHandler implements QueryBuilderFilterHandler { diff --git a/src/Reader/FilterHandler/LessThanHandler.php b/src/Reader/FilterHandler/LessThanHandler.php index 851c8ff..43d8d3c 100644 --- a/src/Reader/FilterHandler/LessThanHandler.php +++ b/src/Reader/FilterHandler/LessThanHandler.php @@ -4,10 +4,10 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler; -use Override; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\LessThan; use Yiisoft\Data\Reader\FilterInterface; +use Override; final class LessThanHandler implements QueryBuilderFilterHandler { diff --git a/src/Reader/FilterHandler/LessThanOrEqualHandler.php b/src/Reader/FilterHandler/LessThanOrEqualHandler.php index 702e07c..83ddc85 100644 --- a/src/Reader/FilterHandler/LessThanOrEqualHandler.php +++ b/src/Reader/FilterHandler/LessThanOrEqualHandler.php @@ -4,10 +4,10 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler; -use Override; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\LessThanOrEqual; use Yiisoft\Data\Reader\FilterInterface; +use Override; final class LessThanOrEqualHandler implements QueryBuilderFilterHandler { diff --git a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php index 5cc3630..027d416 100644 --- a/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/BaseLikeHandler.php @@ -4,17 +4,17 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler\LikeHandler; -use Override; use Stringable; 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 { protected array $escapingReplacements = [ - '%' => '\%', - '_' => '\_', + '%' => '\%', + '_' => '\_', '\\' => '\\\\', ]; @@ -27,11 +27,10 @@ public function getFilterClass(): string protected function prepareValue(string|Stringable $value, LikeMode $mode): string { $value = strtr((string) $value, $this->escapingReplacements); - return match ($mode) { - LikeMode::Contains => '%' . $value . '%', + LikeMode::Contains => '%' . $value . '%', LikeMode::StartsWith => $value . '%', - LikeMode::EndsWith => '%' . $value, + LikeMode::EndsWith => '%' . $value, }; } } diff --git a/src/Reader/FilterHandler/LikeHandler/LikeHandlerFactory.php b/src/Reader/FilterHandler/LikeHandler/LikeHandlerFactory.php index 8c9b3c8..c6bcf85 100644 --- a/src/Reader/FilterHandler/LikeHandler/LikeHandlerFactory.php +++ b/src/Reader/FilterHandler/LikeHandler/LikeHandlerFactory.php @@ -17,11 +17,11 @@ public static function getLikeHandler(string $driverType): QueryBuilderFilterHan // default - ignored due to the complexity of testing and preventing splitting of databaseDriver argument. // @codeCoverageIgnoreStart return match ($driverType) { - 'SQLite' => new SqliteLikeHandler(), - 'MySQL' => new MysqlLikeHandler(), - 'Postgres' => new PostgresLikeHandler(), + 'SQLite' => new SqliteLikeHandler(), + 'MySQL' => new MysqlLikeHandler(), + 'Postgres' => new PostgresLikeHandler(), 'SQLServer' => new SqlServerLikeHandler(), - default => throw new RuntimeException("$driverType database driver is not supported."), + default => throw new RuntimeException("$driverType database driver is not supported."), }; // @codeCoverageIgnoreEnd } diff --git a/src/Reader/FilterHandler/LikeHandler/MysqlLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/MysqlLikeHandler.php index 78f66df..5e5fa2a 100644 --- a/src/Reader/FilterHandler/LikeHandler/MysqlLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/MysqlLikeHandler.php @@ -4,9 +4,9 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler\LikeHandler; -use Override; use Yiisoft\Data\Reader\Filter\Like; use Yiisoft\Data\Reader\FilterInterface; +use Override; final class MysqlLikeHandler extends BaseLikeHandler { @@ -14,6 +14,7 @@ final class MysqlLikeHandler extends BaseLikeHandler public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var Like $filter */ + if ($filter->caseSensitive !== true) { return [$filter->field, 'like', $this->prepareValue($filter->value, $filter->mode)]; } diff --git a/src/Reader/FilterHandler/LikeHandler/PostgresLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/PostgresLikeHandler.php index d885e3e..a5a06e6 100644 --- a/src/Reader/FilterHandler/LikeHandler/PostgresLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/PostgresLikeHandler.php @@ -4,9 +4,9 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler\LikeHandler; -use Override; use Yiisoft\Data\Reader\Filter\Like; use Yiisoft\Data\Reader\FilterInterface; +use Override; final class PostgresLikeHandler extends BaseLikeHandler { @@ -14,6 +14,7 @@ final class PostgresLikeHandler extends BaseLikeHandler public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var Like $filter */ + if ($filter->caseSensitive !== true) { return [$filter->field, 'ilike', $this->prepareValue($filter->value, $filter->mode)]; } diff --git a/src/Reader/FilterHandler/LikeHandler/SqlServerLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/SqlServerLikeHandler.php index 49aacbf..ff875c7 100644 --- a/src/Reader/FilterHandler/LikeHandler/SqlServerLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/SqlServerLikeHandler.php @@ -4,10 +4,10 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler\LikeHandler; -use Override; use Yiisoft\Data\Cycle\Exception\NotSupportedFilterOptionException; use Yiisoft\Data\Reader\Filter\Like; use Yiisoft\Data\Reader\FilterInterface; +use Override; final class SqlServerLikeHandler extends BaseLikeHandler { @@ -20,6 +20,7 @@ public function __construct() public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var Like $filter */ + if ($filter->caseSensitive === true) { throw new NotSupportedFilterOptionException(optionName: 'caseSensitive', driverType: 'SQLServer'); } diff --git a/src/Reader/FilterHandler/LikeHandler/SqliteLikeHandler.php b/src/Reader/FilterHandler/LikeHandler/SqliteLikeHandler.php index 2a851a5..3786d96 100644 --- a/src/Reader/FilterHandler/LikeHandler/SqliteLikeHandler.php +++ b/src/Reader/FilterHandler/LikeHandler/SqliteLikeHandler.php @@ -4,10 +4,10 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler\LikeHandler; -use Override; use Yiisoft\Data\Cycle\Exception\NotSupportedFilterOptionException; use Yiisoft\Data\Reader\Filter\Like; use Yiisoft\Data\Reader\FilterInterface; +use Override; final class SqliteLikeHandler extends BaseLikeHandler { @@ -20,6 +20,7 @@ public function __construct() public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var Like $filter */ + if ($filter->caseSensitive === true) { throw new NotSupportedFilterOptionException(optionName: 'caseSensitive', driverType: 'SQLite'); } diff --git a/src/Reader/FilterHandler/NoneHandler.php b/src/Reader/FilterHandler/NoneHandler.php index deaf342..d6f0bfe 100644 --- a/src/Reader/FilterHandler/NoneHandler.php +++ b/src/Reader/FilterHandler/NoneHandler.php @@ -7,10 +7,10 @@ use Cycle\Database\Injection\Expression; use Cycle\Database\Query\SelectQuery; use Cycle\ORM\Select\QueryBuilder; -use Override; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\None; use Yiisoft\Data\Reader\FilterInterface; +use Override; final class NoneHandler implements QueryBuilderFilterHandler { diff --git a/src/Reader/FilterHandler/NotHandler.php b/src/Reader/FilterHandler/NotHandler.php index 0a9ca0a..37ce2ee 100644 --- a/src/Reader/FilterHandler/NotHandler.php +++ b/src/Reader/FilterHandler/NotHandler.php @@ -4,7 +4,6 @@ namespace Yiisoft\Data\Cycle\Reader\FilterHandler; -use Override; use Yiisoft\Data\Cycle\Exception\NotSupportedFilterException; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\AndX; @@ -20,6 +19,7 @@ use Yiisoft\Data\Reader\Filter\Not; use Yiisoft\Data\Reader\Filter\OrX; use Yiisoft\Data\Reader\FilterInterface; +use Override; final class NotHandler implements QueryBuilderFilterHandler { @@ -33,6 +33,7 @@ public function getFilterClass(): string public function getAsWhereArguments(FilterInterface $filter, array $handlers): array { /** @var Not $filter */ + $convertedFilter = $this->convertFilter($filter->filter); $handledFilter = $convertedFilter instanceof Not ? $convertedFilter->filter : $convertedFilter; $handler = $handlers[$handledFilter::class] ?? null; @@ -48,7 +49,7 @@ public function getAsWhereArguments(FilterInterface $filter, array $handlers): a $operator = $where[1]; $where[1] = match ($operator) { 'between', 'in', 'like' => "not $operator", - '=' => '!=', + '=' => '!=', default => $operator, }; @@ -72,13 +73,13 @@ private function convertFilter(FilterInterface $filter, int $notCount = 1): Filt $filter->filters, ), ), - GreaterThan::class => new LessThanOrEqual($filter->field, $filter->value), + GreaterThan::class => new LessThanOrEqual($filter->field, $filter->value), GreaterThanOrEqual::class => new LessThan($filter->field, $filter->value), - LessThan::class => new GreaterThanOrEqual($filter->field, $filter->value), - LessThanOrEqual::class => new GreaterThan($filter->field, $filter->value), + LessThan::class => new GreaterThanOrEqual($filter->field, $filter->value), + LessThanOrEqual::class => new GreaterThan($filter->field, $filter->value), Between::class, Equals::class, EqualsNull::class, In::class, Like::class => new Not($filter), Not::class => $this->convertNot($filter, $notCount), - default => $filter, + default => $filter, }; } diff --git a/src/Reader/FilterHandler/OrXHandler.php b/src/Reader/FilterHandler/OrXHandler.php index 44d5792..e79da00 100644 --- a/src/Reader/FilterHandler/OrXHandler.php +++ b/src/Reader/FilterHandler/OrXHandler.php @@ -6,11 +6,11 @@ use Cycle\Database\Query\SelectQuery; use Cycle\ORM\Select\QueryBuilder; -use Override; use Yiisoft\Data\Cycle\Exception\NotSupportedFilterException; use Yiisoft\Data\Cycle\Reader\QueryBuilderFilterHandler; use Yiisoft\Data\Reader\Filter\OrX; use Yiisoft\Data\Reader\FilterInterface; +use Override; final class OrXHandler implements QueryBuilderFilterHandler { From 3c0eadb1d70ac0477ebd326003e62e1659c93720 Mon Sep 17 00:00:00 2001 From: Ross Addison Date: Tue, 27 Jan 2026 10:37:02 +0000 Subject: [PATCH 17/17] Static Analysis Test --- .github/workflows/static.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/static.yml b/.github/workflows/static.yml index d03874d..eec5542 100644 --- a/.github/workflows/static.yml +++ b/.github/workflows/static.yml @@ -29,4 +29,4 @@ jobs: os: >- ['ubuntu-latest'] php: >- - ['8.1', '8.2', '8.3', '8.4'] + ['8.1', '8.2', '8.3', '8.4', '8.5']