CakePHP 3.0.9 Released

The CakePHP core team is happy to announce the immediate availability of CakePHP 3.0.9. This is a maintenance release for the 3.0 branch.


You can expect the following changes in 3.0.9. See the changelog for every commit.

  • Index and constraint reflection in MySQL now scopes to the current database.
  • . is now allowed in ObjectRegistry keys. This allows cache configurations to have . in their names.
  • Datetime validation now correctly handles meridian values.
  • Improved API documentation.
  • Pagination link generation is correct with custom routes.
  • Entity::extractOriginalChanged() now returns properties that were initially null.
  • Marshalling _joinData in belongsToMany associations with existing entities is now handled correctly.
  • Text::tokenize() now works as expected when the separator is a multi-byte character.
  • Folders generated by i18n extract have the correct permissions assigned.
  • Entities are now marked as ‘clean’ after the afterSave event.
  • The ORM does not emit UPDATE statements for hasMany and belongsToMany associations that have not actually changed.
  • Response::file() now accepts files with .. in the basename.


As part of the 3.0 patch releases we are experimenting with implementing smaller net new features. In 3.0.9 the following new features were added:

  • Associations can now define a bindingKey() this column allows you to bind associations to non-primary key columns. This aims to remove the need to define foreignKey => false in associations.
  • Collections can now be serialized and unserialized with ease. This makes caching collections easier.
  • Exception attributes are no longer logged when debug=0.
  • Response::body() accepts a callable that can echo content directly or return the response body.
  • Email::configuredTransport() was added to allow enumeration of the configured email transports.
  • String templates accept . and _ in variable names. This improves compatibility with arrays generated by Hash::flatten()
  • Custom Type classes can define a baseType that maps to a simpler type. This makes it easier for FormHelper to generate inputs for custom types.
  • i18n extract now supports a --no-location option. This option will omit the location comments for messages from the generated POT file.

As always, a huge thanks to all the community members that helped make this release happen by reporting issues and sending pull requests.

Download a packaged release on github.