|
| 1 | +# Migration Guide: Pimcore 2026.1 |
| 2 | + |
| 3 | +This guide walks through the steps required to migrate an existing Pimcore installation to Platform Version |
| 4 | +2026.1. It covers the 2026.1-specific tasks in the sequence they must be performed. |
| 5 | + |
| 6 | +For the general major version upgrade process and background on each phase, see |
| 7 | +[Major Version Upgrades](../../03_Major_Version_Upgrades.md). |
| 8 | + |
| 9 | +## Migration Steps |
| 10 | + |
| 11 | +### 1. Update to the Latest 2025.4 Release |
| 12 | + |
| 13 | +Start from the latest available bugfix release of 2025.4. This ensures all deprecation notices and |
| 14 | +preparatory changes from the 2025 cycle are in place. |
| 15 | + |
| 16 | +```bash |
| 17 | +composer require pimcore/platform-version:"^2025.4" --no-update |
| 18 | +COMPOSER_MEMORY_LIMIT=-1 composer update |
| 19 | +bin/console doctrine:migrations:migrate |
| 20 | +``` |
| 21 | + |
| 22 | +### 2. Install Pimcore Studio (if not already done) |
| 23 | + |
| 24 | +2026.1 removes Admin UI Classic entirely. Pimcore Studio must be installed and fully functional before you |
| 25 | +upgrade. If Studio is already active in your installation, verify it works correctly and skip to Step 3. |
| 26 | +See the [Studio UI installation guide](../../../../03_Getting_Started/01_Installation/03_Advanced_Installation_Topics/02_Pimcore_Studio_Setup.md) |
| 27 | +for the full setup guide. |
| 28 | + |
| 29 | +After installation, log into Pimcore Studio and verify it works correctly on 2025.4 before proceeding. |
| 30 | + |
| 31 | +### 3. Resolve All Deprecations |
| 32 | + |
| 33 | +Check for deprecation notices before upgrading: |
| 34 | + |
| 35 | +- **Symfony deprecation log** - `var/log/dev.deprecations.log` or the profiler toolbar in dev mode |
| 36 | +- **Code** - search for `@deprecated` usages in your codebase and custom bundles |
| 37 | +- **Pimcore Studio** - some deprecations surface as warnings in the UI |
| 38 | + |
| 39 | +Resolve everything you can. For deprecations that depend on third-party bundles, verify those bundles have a |
| 40 | +compatible release for 2026.1 before proceeding. |
| 41 | + |
| 42 | +### 4. Back Up |
| 43 | + |
| 44 | +Create a full backup of your database and project files. If the upgrade fails, restore the backup, revert |
| 45 | +`composer.lock`, and run `composer install` to return to the previous state. |
| 46 | + |
| 47 | +### 5. Remove Deprecated Bundles from composer.json |
| 48 | + |
| 49 | +The following bundles are removed in 2026.1. Remove them from `composer.json` and clean up any related |
| 50 | +service configuration, event listeners, and references in your code. Do not run `composer update` yet - |
| 51 | +that happens in Step 9. |
| 52 | + |
| 53 | +Functionality now part of Pimcore Studio: |
| 54 | +- `pimcore/advanced-object-search-bundle` |
| 55 | +- `pimcore/perspective-editor` |
| 56 | +- `pimcore/simple-backend-search-bundle` |
| 57 | + |
| 58 | +Discontinued: |
| 59 | +- `pimcore/file-explorer-bundle` |
| 60 | +- `pimcore/glossary-bundle` |
| 61 | +- `pimcore/google-marketing-bundle` |
| 62 | +- `pimcore/newsletter-bundle` |
| 63 | +- `pimcore/seo-bundle` (redirects, robots.txt, and sitemaps remain in the core) |
| 64 | +- `pimcore/static-routes-bundle` |
| 65 | +- `pimcore/system-info-bundle` |
| 66 | +- `pimcore/word-export-bundle` |
| 67 | +- `pimcore/output-data-config-toolkit` |
| 68 | +- `pimcore/web2print-tools` |
| 69 | + |
| 70 | +### 6. Update PHP and Symfony Version Constraints |
| 71 | + |
| 72 | +PHP 8.3 and Symfony 6.x support have been removed. |
| 73 | + |
| 74 | +- Ensure your server runs **PHP 8.4 or 8.5** |
| 75 | +- Remove any explicit Symfony 6.x version constraints from `composer.json` |
| 76 | + |
| 77 | +Do not run `composer update` yet. The update to Symfony 7.x happens as part of Step 9. |
| 78 | + |
| 79 | +### 7. Migrate Email Log Folder Structure |
| 80 | + |
| 81 | +The folder structure for email logs has changed to `YYYY/MM/DD/<filename>`. Run this migration against your |
| 82 | +current 2025.4 installation before upgrading: |
| 83 | + |
| 84 | +```bash |
| 85 | +bin/console pimcore:migrate:mail-logs-folder-structure |
| 86 | +``` |
| 87 | + |
| 88 | +Alternatively, move the existing log files manually into the new directory structure. |
| 89 | + |
| 90 | +### 8. Fix Database Collation |
| 91 | + |
| 92 | +2026.1 explicitly sets `utf8mb4_unicode_520_ci` on all `utf8mb4` tables and columns. Previous versions did |
| 93 | +not specify a collation, so MySQL/MariaDB applied its own default (`utf8mb4_general_ci` on MySQL 5.7/MariaDB, |
| 94 | +`utf8mb4_0900_ai_ci` on MySQL 8). The mismatch can cause foreign key constraint errors during the migrations |
| 95 | +in Step 11. |
| 96 | + |
| 97 | +This is **not** handled by the standard Doctrine migration - run it manually before upgrading. |
| 98 | + |
| 99 | +**1. Generate ALTER TABLE statements.** Run the query below to produce the statements for all affected |
| 100 | +tables. Copy the output. |
| 101 | + |
| 102 | +```sql |
| 103 | +SELECT CONCAT( |
| 104 | + 'ALTER TABLE `', TABLE_NAME, |
| 105 | + '` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;' |
| 106 | +) |
| 107 | +FROM INFORMATION_SCHEMA.TABLES |
| 108 | +WHERE TABLE_SCHEMA = 'your_database_name' |
| 109 | + AND TABLE_TYPE = 'BASE TABLE' |
| 110 | + AND TABLE_COLLATION IN ('utf8mb4_general_ci', 'utf8mb4_0900_ai_ci') |
| 111 | +ORDER BY TABLE_NAME; |
| 112 | +``` |
| 113 | + |
| 114 | +**2. Safety check.** Before executing, verify that no `utf8mb4_bin` columns (used for case-sensitive |
| 115 | +keys and JSON data) appear in the results. Those must not be changed. |
| 116 | + |
| 117 | +```sql |
| 118 | +SELECT TABLE_NAME, COLUMN_NAME, COLUMN_TYPE, COLLATION_NAME |
| 119 | +FROM INFORMATION_SCHEMA.COLUMNS |
| 120 | +WHERE TABLE_SCHEMA = 'your_database_name' |
| 121 | + AND COLLATION_NAME IN ('utf8mb4_general_ci', 'utf8mb4_0900_ai_ci') |
| 122 | +ORDER BY TABLE_NAME, COLUMN_NAME; |
| 123 | +``` |
| 124 | + |
| 125 | +**3. Execute.** Run the `ALTER TABLE` statements generated above against your database. |
| 126 | + |
| 127 | +### 9. Update to 2026.1 |
| 128 | + |
| 129 | +```bash |
| 130 | +composer require pimcore/platform-version:"^2026.1" --no-update |
| 131 | +COMPOSER_MEMORY_LIMIT=-1 composer update |
| 132 | +``` |
| 133 | + |
| 134 | +Do not run migrations yet. |
| 135 | + |
| 136 | +### 10. Apply Code Changes |
| 137 | + |
| 138 | +Apply the following breaking changes to your codebase: |
| 139 | + |
| 140 | +- Remove any remaining references to removed bundles or Admin Classic interfaces |
| 141 | + (`PimcoreBundleAdminClassicInterface`, `BundleAdminClassicTrait`, `AdminSubscriber`, etc.) |
| 142 | +- Update the Messenger transport DSN: rename `PIMCORE_MESSENGER_TRANSPORT_DSN` to |
| 143 | + `PIMCORE_MESSENGER_TRANSPORT_DSN_PREFIX` and add a trailing separator |
| 144 | + (e.g. `doctrine://default` becomes `doctrine://default?queue_name=`). |
| 145 | + This affects both your `.env` files and any deployment configuration (secrets managers, Kubernetes, etc.) |
| 146 | + where this variable is set. |
| 147 | +- Update OpenSearch/Elasticsearch configuration from the `hosts` array YAML format to the DSN env var format |
| 148 | + (`PIMCORE_OPENSEARCH_DSN` or `PIMCORE_ELASTICSEARCH_DSN`) |
| 149 | +- If you use the Pimcore installer in CI/CD pipelines, update from `bin/console pimcore:install` to |
| 150 | + `vendor/bin/pimcore-install --install-profile=<YourProfileClass>` |
| 151 | + |
| 152 | +Review the [Core Framework upgrade notes](https://github.com/pimcore/pimcore/blob/2026.1/doc/13_Upgrade_Notes/README.md#pimcore-202610) |
| 153 | +and the upgrade notes of each bundle you use (see [All Bundle Upgrade Notes](README.md#upgrade-notes)). |
| 154 | + |
| 155 | +Clear the Symfony container cache after applying changes: |
| 156 | + |
| 157 | +```bash |
| 158 | +bin/console cache:clear |
| 159 | +``` |
| 160 | + |
| 161 | +### 11. Run Migrations |
| 162 | + |
| 163 | +```bash |
| 164 | +bin/console doctrine:migrations:migrate |
| 165 | +``` |
| 166 | + |
| 167 | +### 12. Rebuild Class Definitions |
| 168 | + |
| 169 | +After migrations, rebuild the object class definitions to ensure all generated PHP classes reflect the |
| 170 | +current state: |
| 171 | + |
| 172 | +```bash |
| 173 | +bin/console pimcore:deployment:classes-rebuild |
| 174 | +``` |
| 175 | + |
| 176 | +### 13. Clear Application Caches |
| 177 | + |
| 178 | +```bash |
| 179 | +bin/console pimcore:cache:clear |
| 180 | +``` |
| 181 | + |
| 182 | +### 14. Test |
| 183 | + |
| 184 | +- Log into Pimcore Studio and verify data objects, assets, and documents load and save correctly |
| 185 | +- Run your automated test suite |
| 186 | +- Verify custom bundles, integrations, and event listeners |
| 187 | +- Check functionality related to resolved deprecations |
| 188 | + |
| 189 | +## Post-Upgrade Manual Work |
| 190 | + |
| 191 | +The following cannot be handled by Composer or migrations. Plan time for these after the upgrade is complete. |
| 192 | + |
| 193 | +### Perspectives and Custom Views |
| 194 | + |
| 195 | +From a functional standpoint, perspectives and custom views serve the same purpose in Pimcore Studio as in |
| 196 | +the Classic UI. The technical implementation is entirely different, however. Existing perspectives and custom |
| 197 | +views cannot be imported or automatically converted - they must be recreated in Pimcore Studio. |
| 198 | + |
| 199 | +### Dashboards |
| 200 | + |
| 201 | +Dashboards created in the Classic UI are not compatible with Pimcore Studio and must be recreated. Reports |
| 202 | +used within dashboards are unaffected and continue to work without migration. |
| 203 | + |
| 204 | +### Custom Grid Configurations |
| 205 | + |
| 206 | +The technical implementation of grid configurations has changed completely. All existing custom grid |
| 207 | +configurations must be rebuilt in Pimcore Studio - including globally defined configurations and user-level |
| 208 | +configurations. Custom grid operators must also be reviewed and updated for compatibility with the new |
| 209 | +grid architecture. |
| 210 | + |
| 211 | +### Datahub Configuration Schema Migration |
| 212 | + |
| 213 | +Datahub File Export, Datahub Productsup, Datahub Simple REST, and Datahub Webhooks have moved from a |
| 214 | +tree-based schema definition to a pipeline-based architecture. Existing configurations continue to execute |
| 215 | +without changes. However, a configuration must be fully migrated to the new format before it can be edited |
| 216 | +in Pimcore Studio. Migration is done through the Pimcore Studio UI. |
| 217 | + |
| 218 | +Read-only support for the legacy tree-based schema definition will be removed in 2027.1.0. |
| 219 | +See the [Release Notes](README.md#datahub-configuration-schema-changes) and the upgrade notes of the |
| 220 | +affected bundles for details. |
| 221 | + |
| 222 | +### Custom Bundles and Backend Extensions |
| 223 | + |
| 224 | +Custom bundles, event listeners, service definitions, and integrations must all be reviewed. Pay particular |
| 225 | +attention to: |
| 226 | + |
| 227 | +- Admin Classic UI extensions, plugins, and custom controllers - removed, must be reimplemented for |
| 228 | + Pimcore Studio if still needed |
| 229 | +- Custom grid operators - review for compatibility with the new pipeline-based grid architecture |
| 230 | +- Event listeners referencing removed classes (`AdminSubscriber`, |
| 231 | + `PimcoreBundleAdminClassicInterface`, etc.) |
| 232 | +- Any code that depends on the removed bundles listed in Step 5 |
| 233 | + |
| 234 | +Test all custom functionality in a staging environment before going live. |
| 235 | + |
| 236 | +## Further Resources |
| 237 | + |
| 238 | +- [Release Notes for 2026.1](README.md) |
| 239 | +- [Major Version Upgrades](../../03_Major_Version_Upgrades.md) |
| 240 | +- [Core Framework Upgrade Notes](https://github.com/pimcore/pimcore/blob/2026.1/doc/13_Upgrade_Notes/README.md#pimcore-202610) |
| 241 | +- [All Bundle Upgrade Notes](README.md#upgrade-notes) |
0 commit comments