Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
9fc6f3b
Document console UX improvements from cakephp/cakephp#19303
josbeir Mar 28, 2026
ea55ea9
Initial attempt reusable workflow (#8268)
josbeir Apr 3, 2026
45be89d
Merge branch '5.next' into 5.next-console-ux
markstory Apr 4, 2026
0eb9c04
Remove redundant spaces
markstory Apr 4, 2026
5756f27
Merge pull request #8256 from cakephp/5.next-console-ux
markstory Apr 4, 2026
3fee6dd
re-organize plugins to navbar (#8269)
josbeir Apr 4, 2026
b401e84
Add missing queue plugin to plugins list
josbeir Apr 5, 2026
fc0937c
Bump vite from 7.3.1 to 7.3.2 (#8270)
dependabot[bot] Apr 7, 2026
a244009
Fix lowercase word.
dereuromark Apr 9, 2026
da38b39
fix: Infragistics::slug() changed into Text::slug() (#8275)
zigzagdev Apr 10, 2026
a2d9159
Precision about OptionParser 'separator' (#8274)
Erwane Apr 10, 2026
7f1f801
Document PostgreSQL index access method reflection (#8277)
dereuromark Apr 11, 2026
f367ec9
Document FunctionsBuilder::stringAgg()
dereuromark Apr 11, 2026
c124ae6
improve ORM strategy changes (#8280)
LordSimal Apr 12, 2026
14db7d6
Document EXCEPT and EXCEPT ALL set operations (#8278)
dereuromark Apr 12, 2026
4de0c36
Merge remote-tracking branch 'origin/5.next' into docs-string-agg
dereuromark Apr 14, 2026
4fdd917
Document Connection::afterCommit() and updated afterSaveCommit/afterD…
jamisonbryant Apr 14, 2026
e86bd9d
Add afterCommit entries to 5.4 migration guide
jamisonbryant Apr 14, 2026
0746926
Doc for Text::mask()
SadiHassan Apr 15, 2026
9ad965d
Added Text::mask() in migration guide
SadiHassan Apr 15, 2026
20b9119
Moved function doc under utility
SadiHassan Apr 15, 2026
5b47f4f
Merge pull request #8282 from SadiHassan/mask-func-doc-v0
ADmad Apr 15, 2026
83a104f
Change code-formatted notes to italic emphasis
dereuromark Apr 16, 2026
5e4e8ea
Change code-formatted notes to italic emphasis (#8283)
dereuromark Apr 16, 2026
3adcb23
Merge pull request #8281 from cakephp/docs/connection-after-commit
jamisonbryant Apr 16, 2026
5d904e0
add docs for new mockModel method in TestCase (#8276)
LordSimal Apr 16, 2026
e275970
Improve formatting of connection options (#8284)
markstory Apr 18, 2026
271cab9
Update docs for request detectors (#8285)
ADmad Apr 20, 2026
25b5072
fix install docs refering to 5.3.0 (#8286)
LordSimal Apr 20, 2026
7e1383d
Add modern elements to Structure & Conventions page
dereuromark Apr 20, 2026
2772f7e
Merge remote-tracking branch 'origin/5.next' into docs-string-agg
dereuromark Apr 20, 2026
6ee902d
chore: remove redundant colon (#8288)
zigzagdev Apr 22, 2026
78fbd40
Merge pull request #8287 from cakephp/docs-conventions-modern-elements
markstory Apr 24, 2026
57513e8
Merge pull request #8279 from cakephp/docs-string-agg
markstory Apr 24, 2026
695cab0
Doc for `Text::maskValue()` (#8290)
SadiHassan Apr 28, 2026
32d8c4a
chore: delete redundant particle を (#8292)
zigzagdev May 3, 2026
f420015
Add JsonStreamResponse documentation for 5.4 (#8255)
dereuromark May 3, 2026
6719253
add documentation about events hook change (#8293)
LordSimal May 3, 2026
8b01462
add ApcuEngine options section
LordSimal May 9, 2026
560db6c
Fix config name in caching documentation (#8300)
ADmad May 9, 2026
16fc583
Merge pull request #8299 from cakephp/5.x-apcu-engine
markstory May 10, 2026
0ed3aee
Fix code block (#8302)
albertcansado May 12, 2026
d7396c4
Merge branch '5.x' into 5.next
LordSimal May 12, 2026
c372fbe
Document i18n cache key prefix and configurable cache config (5.next)…
dereuromark May 12, 2026
663c898
Document that i18n extract now supports the extraction of Label attri…
nicosp May 13, 2026
3a1c8df
add docs about new table entity assertion (#8303)
LordSimal May 13, 2026
56b1a16
Document Table::findUnhydrated() and SelectUnhydratedQuery
dereuromark May 17, 2026
d7380bf
Document 5.4 features: PluralRules, EnumLabelTrait, FormHelper hidden…
dereuromark May 20, 2026
3d06e49
Shorten subcommand validation migration entry
dereuromark May 20, 2026
45eabf4
Merge pull request #8308 from cakephp/docs/5.4-feature-coverage
markstory May 24, 2026
5a46306
Merge pull request #8305 from cakephp/docs-find-unhydrated
markstory May 24, 2026
6eb9405
Fix UnhydratedSelectQuery class name in 5.4 docs
dereuromark May 24, 2026
f82e7b4
Move Migration guides under 'getting started' in toc (#8307)
markstory May 25, 2026
9d1422a
Add PHP extension installation step in Dockerfile (#8295)
blieb May 25, 2026
944027e
Add locking documentation (#8272)
dereuromark May 25, 2026
23060cc
Document LoggedQuery::setRedactor() (#8291)
dereuromark May 25, 2026
569f18a
Merge remote-tracking branch 'origin/5.x' into merge-5x-into-5next
dereuromark May 25, 2026
ec740ff
Remove stray merge marker
dereuromark May 25, 2026
982fe37
Merge 5.x into 5.next (#8309)
dereuromark May 25, 2026
09e87b3
add documentation for new event listeneres DI support (#8310)
LordSimal May 29, 2026
6054277
[fix] - Remove unnecessary apostrophes (#8311)
albertcansado Jun 20, 2026
449d8c4
Bump actions/checkout from 6 to 7 (#8313)
dependabot[bot] Jun 22, 2026
cedf9f1
Bump postcss from 8.5.8 to 8.5.15 (#8314)
dependabot[bot] Jun 22, 2026
6537472
Harmonize FormHelper option-key docs to unquoted code spans (#8312)
dereuromark Jun 22, 2026
22f9822
Correct class name formatting in locking.md (#8316)
PhantomWatson Jun 30, 2026
36f4721
Quickstart: run migrations after correcting the join-table migration …
dereuromark Jun 30, 2026
5c2cc56
Document withStringBody() vs auto-render interaction (#8315)
dereuromark Jun 30, 2026
854b381
npm update for docs
LordSimal Jul 1, 2026
84db126
Fix incorrect method name findUnhydrated in 5.4 docs
dereuromark Jul 1, 2026
d85e8f1
Order 5.0 Upgrade Guide before 5.0 Migration Guide in sidebar
dereuromark Jul 15, 2026
f0e0dc1
Merge branch '5.x' into 5.next
dereuromark Jul 15, 2026
7d39e09
Merge branch '5.next' into 6.x
dereuromark Jul 15, 2026
d2002c2
Move Migration Guides group under Getting Started in 6.x sidebar
dereuromark Jul 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 28 additions & 1 deletion .vitepress/config.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,32 @@ const versions = {
],
};

const plugins = {
text: "Plugins",
items: [
{
text: "Core Plugins",
items: [
{ text: "Authentication", link: "https://book.cakephp.org/authentication/", target: "_self" },
{ text: "Authorization", link: "https://book.cakephp.org/authorization/", target: "_self" },
{ text: "Bake", link: "https://book.cakephp.org/bake/", target: "_self" },
{ text: "Chronos", link: "https://book.cakephp.org/chronos/", target: "_self" },
{ text: "Debug Kit", link: "https://book.cakephp.org/debugkit/", target: "_self" },
{ text: "Elasticsearch", link: "https://book.cakephp.org/elasticsearch/", target: "_self" },
{ text: "Migrations", link: "https://book.cakephp.org/migrations/", target: "_self" },
{ text: "Phinx", link: "https://book.cakephp.org/phinx/", target: "_self" },
{ text: "Queue", link: "https://book.cakephp.org/queue/", target: "_self" },
],
},
{
text: "Community",
items: [
{ text: "Community Plugins", link: "https://plugins.cakephp.org/", target: "_self" },
],
},
],
};

const substitutions = {
'|phpversion|': { value: '8.5', format: 'bold' },
'|minphpversion|': { value: '8.4', format: 'italic' },
Expand Down Expand Up @@ -53,7 +79,7 @@ export default {
nav: [
{ text: "Guide", link: "/intro" },
{ text: "API", link: "https://api.cakephp.org/" },
{ text: "Documentation", link: "/" },
{ ...plugins },
{ ...versions },
],
versionBanner: {
Expand All @@ -75,6 +101,7 @@ export default {
{ text: "ガイド", link: "/ja/intro" },
{ text: "API", link: "https://api.cakephp.org/" },
{ text: "ドキュメント", link: "/ja/" },
{ ...plugins },
{ ...versions },
],
sidebar: toc_ja,
Expand Down
33 changes: 19 additions & 14 deletions .vitepress/toc_en.json
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,24 @@
]
}
]
},
{
"text": "Migration Guides",
"collapsed": true,
"items": [
{
"text": "Upgrading CakePHP",
"link": "/appendices/migration-guides"
},
{
"text": "6.0 Upgrade Guide",
"link": "/appendices/6-0-upgrade-guide"
},
{
"text": "6.0 Migration Guide",
"link": "/appendices/6-0-migration-guide"
}
]
}
]
},
Expand Down Expand Up @@ -398,24 +416,11 @@
"text": "Appendices",
"items": [
{ "text": "Appendices", "link": "/appendices" },
{
"text": "Migration Guides",
"link": "/appendices/migration-guides"
},
{
"text": "6.0 Migration Guide",
"link": "/appendices/6-0-migration-guide"
},
{
"text": "6.0 Upgrade Guide",
"link": "/appendices/6-0-upgrade-guide"
},
{
"text": "CakePHP Development Process",
"link": "/appendices/cakephp-development-process"
},
{ "text": "Glossary", "link": "/appendices/glossary" },
{ "text": "PHPUnit Upgrade", "link": "/appendices/phpunit-upgrade" }
{ "text": "Glossary", "link": "/appendices/glossary" }
]
}
]
Expand Down
27 changes: 5 additions & 22 deletions .vitepress/toc_ja.json
Original file line number Diff line number Diff line change
Expand Up @@ -394,29 +394,12 @@
"text": "依存性注入",
"link": "/ja/development/dependency-injection"
},
{ "text": "プラグイン", "link": "/ja/plugins" },
{ "text": "エラー", "link": "/ja/development/errors" },
{ "text": "REST", "link": "/ja/development/rest" },
{ "text": "テスト", "link": "/ja/development/testing" }
]
},
{
"text": "プラグイン",
"collapsed": true,
"items": [
{ "text": "プラグインの作成", "link": "/ja/plugins" },
{
"text": "コアプラグイン",
"items": [
{ "text": "Bake", "link": "https://book.cakephp.org/bake/2/en/index.html" },
{ "text": "Chronos", "link": "https://book.cakephp.org/chronos/" },
{ "text": "Debug Kit", "link": "https://book.cakephp.org/debugkit/" },
{ "text": "Elasticsearch", "link": "https://book.cakephp.org/elasticsearch/" },
{ "text": "マイグレーション", "link": "https://book.cakephp.org/migrations/" },
{ "text": "Phinx", "link": "https://book.cakephp.org/phinx/" }
]
}
]
},
{
"text": "セキュリティ",
"collapsed": true,
Expand Down Expand Up @@ -479,14 +462,14 @@
"text": "移行ガイド",
"link": "/ja/appendices/migration-guides"
},
{
"text": "5.0 移行ガイド",
"link": "/ja/appendices/5-0-migration-guide"
},
{
"text": "5.0 アップグレードガイド",
"link": "/ja/appendices/5-0-upgrade-guide"
},
{
"text": "5.0 移行ガイド",
"link": "/ja/appendices/5-0-migration-guide"
},
{
"text": "5.1 移行ガイド",
"link": "/ja/appendices/5-1-migration-guide"
Expand Down
152 changes: 142 additions & 10 deletions docs/en/appendices/5-4-migration-guide.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,42 @@ bin/cake upgrade rector --rules cakephp54 <path/to/app/src>

- `BaseCommand::initialize()` is now being triggered **AFTER** arguments and options have been parsed.

### Console

Running `bin/cake` without providing a command name no longer displays the
"No command provided" error message. Instead, the `help` command is shown
directly.

Unknown tokens after a parent command with subcommands are now rejected
(e.g. `bin/cake i18n nonsense`) instead of silently invoking the parent.
See [Subcommand Validation](../console-commands/commands#subcommand-validation).

The `help` command is now hidden from command listings (via
`CommandHiddenInterface`). It remains accessible by running `bin/cake help` or
`bin/cake help <command>`.

The CakePHP version header in help output is now only shown when the CakePHP
version can be determined. When used outside a CakePHP application (where the
version is reported as `unknown`), the header is omitted.

### Events

Events being registered in either `Application::events()` or `Plugin::events()`
now work in both web and CLI contexts. It is therefore highly recommended to
move your event listeners from the `config/bootstrap.php` file to the
`eventListeners()` method in your `Application` or `Plugin` class. Use the
`events()` method when you need custom registration logic or anonymous
listeners.
See [Application and Plugin Events](../core-libraries/events#registering-event-listeners) for more details.

`Application::eventListeners()` and `Plugin::eventListeners()` were added to
register event listener classes declaratively. These listeners are resolved
through the application's dependency injection container, so they can use
constructor-injected dependencies.

`EventAwareApplicationInterface::pluginEvents()` has been deprecated. Plugin
events are now registered while each plugin is bootstrapped.

### I18n

- `Number::parseFloat()` now returns `null` instead of `0.0` when parsing
Expand All @@ -30,12 +66,32 @@ bin/cake upgrade rector --rules cakephp54 <path/to/app/src>
- The default eager loading strategy for `HasMany` and `BelongsToMany` associations
has changed from `select` to `subquery`. If you need the previous behavior,
explicitly set `'strategy' => 'select'` when defining associations.
See [Associations](../orm/associations#has-many-associations) for more details.
- `Model.afterSaveCommit` and `Model.afterDeleteCommit` events are now fired
when `save()` or `delete()` is called inside an outer transaction. Previously,
these events were silently suppressed. They are now deferred until the
outermost transaction commits, and discarded on rollback.
See [Table Objects](../orm/table-objects#aftersavecommit) for more details.
- Table methods `save()`, `delete()`, `patchEntity()`, `patchEntities()` and `loadInto()`
will now throw an exception if the entity being passed down does not belong to the table instance.
This will prevent accidental data corruption or deleted records. If you don't want this new behavior,
you can disable it by calling `$this->disableEntityClassAssertion();` in your `initialize()` method.

### Controller

- Loading a component with the same alias as the controller's default table now
triggers a warning. See [Component Alias Conflicts](../controllers/components#component-alias-conflicts).

### View

- `FormHelper` now wraps hidden form blocks (CSRF, FormProtection,
`postLink()` / `postButton()`) with the HTML5 boolean `hidden` attribute
instead of an inline `style="display:none;"`. This makes the default markup
compatible with a strict Content-Security-Policy (no need for
`style-src 'unsafe-inline'`). If you previously selected those wrappers via
CSS (e.g. `div[style="display:none;"]`), switch to `[hidden]` or set the
`hiddenClass` template option to opt out and emit a class instead.

## Deprecations

### Command Helpers
Expand All @@ -47,6 +103,13 @@ bin/cake upgrade rector --rules cakephp54 <path/to/app/src>

- The `Mailer::$name` property is unused and has been deprecated.

### ORM

- `SelectQuery::disableHydration()` has been deprecated. Use
[`Table::unhydratedFind()`](../orm/retrieving-data-and-resultsets#getting-arrays-instead-of-entities)
instead, which returns an `UnhydratedSelectQuery` whose static type matches the
array result shape. `disableHydration()` will be removed in 6.0.

## New Features

### Core
Expand All @@ -56,13 +119,27 @@ bin/cake upgrade rector --rules cakephp54 <path/to/app/src>
- A backwards compatible Container implementation has been added to the core. You can opt-in to use it instead of the current
`league/container` implementation by setting `App.container` to `cake` inside your `config/app.php`.
See [Dependency Injection Container](../development/dependency-injection) for more details.
- Added the `Cake\Lock\Lock` facade with pluggable lock engines for Redis,
Memcached, local files, and testing/no-op usage. See [Locking](../core-libraries/locking).

### Collection

- Added [`keys()`](../core-libraries/collections#keys) and [`values()`](../core-libraries/collections#values) methods for extracting keys or re-indexing values.
- Added [`implode()`](../core-libraries/collections#implode) method to concatenate elements into a string.
- Added [`when()`](../core-libraries/collections#when) and [`unless()`](../core-libraries/collections#unless) methods for conditional method chaining.

### Commands

- You can use `$this->io` and `$this->args` inside your commands to access input/output and argument objects
without needing to pass them down from the `execute()` method. **This will be the default in CakePHP 6.0**
as those arguments will be removed from the `execute()` method signature.

### Console

- Added `ConsoleHelpHeaderProviderInterface` to allow host applications to
provide a custom header in console help output.
See [Customizing the Help Header](../console-commands/commands#customizing-the-help-header).

### Controller

- Added `#[RequestToDto]` attribute for automatic mapping of request data to
Expand All @@ -72,29 +149,85 @@ bin/cake upgrade rector --rules cakephp54 <path/to/app/src>
`FormProtectionComponent`.
See [Form Protection Component](../controllers/components/form-protection).

### Http

- Added `JsonStreamResponse` class for memory-efficient streaming of large JSON
datasets using generators. Supports standard JSON arrays and NDJSON formats,
envelope structures with metadata, transform callbacks, and graceful mid-stream
error handling. See [Streaming JSON Responses](../controllers/request-response#streaming-json-responses).

### Database

- Added `notBetween()` method for `NOT BETWEEN` expressions.
See [Query Builder](../orm/query-builder#advanced-conditions).
- Added `inOrNull()` and `notInOrNull()` methods for combining `IN` conditions with `IS NULL`.
- Added `isDistinctFrom()` and `isNotDistinctFrom()` methods for null-safe comparisons.
- Added `FunctionsBuilder::stringAgg()` for portable string aggregation.
Translates to `STRING_AGG` or `GROUP_CONCAT` per driver.
See [Query Builder](../orm/query-builder#string-aggregation).
- Added `Connection::afterCommit()` to register callbacks that run after the
outermost transaction commits. Callbacks are discarded on rollback.
See [Database Basics](../orm/database-basics#aftercommit) for more details.
- Added `except()` and `exceptAll()` methods on `SelectQuery` for `EXCEPT`
and `EXCEPT ALL` set operations. `EXCEPT ALL` is supported on PostgreSQL
and recent MySQL/MariaDB versions; it is not supported on SQLite or SQL Server.
See [Query Builder](../orm/query-builder#except).
- Added PostgreSQL index access method reflection. Non-btree indexes (`gin`,
`gist`, `spgist`, `brin`, `hash`) are now reflected with an `accessMethod`
field and regenerated with the correct `USING` clause. The `Index` class
provides constants (`Index::GIN`, `Index::GIST`, `Index::SPGIST`,
`Index::BRIN`, `Index::HASH`) for these access methods.
See [Reading Indexes and Constraints](../orm/schema-system#reading-indexes-and-constraints).
- Added `Cake\Database\Type\EnumLabelTrait` and the
`Cake\Database\Type\Attribute\Label` attribute. The trait provides a default
`label()` implementation backed by the translator and the attribute lets
individual cases override the derived label. See
[EnumLabelTrait and the Label Attribute](../orm/database-basics#enumlabeltrait-and-the-label-attribute).
- Added `LoggedQuery::setRedactor()` to scrub sensitive values from query
logs. Applies to `__toString()`, `getContext()`, and `jsonSerialize()`,
so file logs, structured loggers, and anything that JSON-encodes a
`LoggedQuery` all see the redacted shape.
See [Redacting Sensitive Values from Query Logs](../orm/database-basics#redacting-sensitive-values-from-query-logs).

### Http

- Added PSR-13 Link implementation with `Cake\Http\Link\Link` and `Cake\Http\Link\LinkProvider`
classes for hypermedia link support. Links added to responses are automatically emitted
as HTTP `Link` headers. See [Hypermedia Links](../controllers/request-response#hypermedia-links).

### I18n

- `Number::toReadableSize()` now uses decimal units (KB = 1000 bytes) by default.
Binary units (KiB = 1024 bytes) can be enabled via parameter or `Number::setUseIecUnits()`.
- Added `TranslatorRegistry::setCacheKeyPrefix()` to isolate translator caches
per tenant when a custom loader produces different messages for the same
domain and locale. Accepts a static string or a `Closure` resolved on every
lookup. See [Isolating Translations Per Tenant](../core-libraries/internationalization-and-localization#isolating-translations-per-tenant).
- Added `TranslatorRegistry::clear()` to drop the in-memory translator map
without touching the persistent cacher. Intended for long-running workers
that switch tenants between jobs.
- Added `I18n::setCacheConfig()` to route translator persistence to a Cache
config other than the default `_cake_translations_`.
- The `cake i18n extract` command now also extracts enum labels using the #[Label] attribute.
- Added `PluralRules::setRule()` to register a custom Gettext plural rule for
a locale whose built-in form is missing or differs from the layout used by
your .po/.mo files. See
[Customizing Plural Rules](../core-libraries/internationalization-and-localization#customizing-plural-rules).

### ORM

- The `associated` option in `newEntity()` and `patchEntity()` now supports
nested array format matching `contain()` syntax.
See [Converting Request Data into Entities](../orm/saving-data#converting-request-data-into-entities).
- Added `Table::unhydratedFind()` and the `UnhydratedSelectQuery` class for
type-safe non-hydrated reads. Unlike `find()->disableHydration()`, the
returned query's static type matches its array result shape, so static
analyzers no longer see `entity|array` on `first()`, `all()`, `toArray()`
and iteration. See [Getting Arrays Instead of Entities](../orm/retrieving-data-and-resultsets#getting-arrays-instead-of-entities).

### Http
### Testsuite

- Added PSR-13 Link implementation with `Cake\Http\Link\Link` and `Cake\Http\Link\LinkProvider`
classes for hypermedia link support. Links added to responses are automatically emitted
as HTTP `Link` headers. See [Hypermedia Links](../controllers/request-response#hypermedia-links).
- `TestCase::mockModel()` has been added to allow mocking of model classes in tests using Mockery mocks.

### Utility

Expand All @@ -103,14 +236,13 @@ bin/cake upgrade rector --rules cakephp54 <path/to/app/src>
path manipulation. See [Filesystem Utilities](../core-libraries/filesystem.md).
- `Security::encrypt()` can now be configured to use longer keys with separate encryption and authentication keys that are derived from the provided key.
You can set `Security.encryptWithRawKey` to enable this behavior. See [here](https://github.com/cakephp/cakephp/pull/19325) for more details.

### Collection

- Added [`keys()`](../core-libraries/collections#keys) and [`values()`](../core-libraries/collections#values) methods for extracting keys or re-indexing values.
- Added [`implode()`](../core-libraries/collections#implode) method to concatenate elements into a string.
- Added [`when()`](../core-libraries/collections#when) and [`unless()`](../core-libraries/collections#unless) methods for conditional method chaining.
- Added `Text::mask()` method which masks a portion of a string with a repeated character. See [Text Masking](../core-libraries/text.md#text-masking) for more details.
- Added `Text::maskValue()` method which masks all occurrences of given substrings within a string using a repeated character. See [Text Masking](../core-libraries/text.md#text-masking) for more details.

### View

- Added `{{inputId}}` template variable to `inputContainer` and `error` templates
in FormHelper. See [Built-in Template Variables](../views/helpers/form#built-in-template-variables).
- `FormHelper::enumOptions()` is now public. This lets you build `select`
options from a backed enum class even when the form was created without
an entity context. See [Creating Select Pickers](../views/helpers/form#creating-select-pickers).
6 changes: 3 additions & 3 deletions docs/en/appendices/migration-guides.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
title: "Migration Guides"
title: "Upgrading CakePHP"
description: "Upgrade CakePHP versions: follow migration guides for each release, understand breaking changes, and smoothly transition between versions."
---

Expand Down Expand Up @@ -31,5 +31,5 @@ bin/cake upgrade rector --rules cakephp60 <path/to/app/src>
Run rector before updating your `composer.json` dependencies
to ensure the tool can resolve class names correctly.

- [6 0 Upgrade Guide](6-0-upgrade-guide)
- [6 0 Migration Guide](6-0-migration-guide)
- [6.0 Upgrade Guide](6-0-upgrade-guide)
- [6.0 Migration Guide](6-0-migration-guide)
Loading