2.4 Migration Guide

CakePHP 2.4 is a fully API compatible upgrade from 2.3. This page outlines the changes and improvements made in 2.4.


  • Logged notice messages will now be colourized in terminals that support colours.
  • ConsoleShell is now deprecated.


  • cake schema generate now supports the --exclude parameter.
  • The constant CAKEPHP_SHELL is now deprecated and will be removed in CakePHP 3.0.


  • cake bake model now supports baking $behaviors. Finding lft, rght and parent_id fields in your table it will add the Tree behavior, for example. You can also extend the ModelTask to support your own behaviors to be recognized.
  • cake bake for views, models, controllers, tests and fixtures now supports a -f or --force parameter to force overwriting of files.
  • Tasks in core can now be aliased in the same way you would Helpers, Components and Behaviors


  • cake bake fixture now supports a --schema parameter to allow baking all fixtures with noninteractive “all” while using schema import.



  • Constants IMAGES_URL, JS_URL, CSS_URL have been deprecated and replaced with config variables App.imageBaseUrl, App.jsBaseUrl, App.cssBaseUrl respectively.
  • Constants IMAGES, JS, CSS have been deprecated.


  • Object::log() had the $scope parameter added.



  • AuthComponent now supports proper stateless mode when using ‘Basic’ or ‘Digest’ authenticators. Starting of session can be prevented by setting AuthComponent::$sessionKey to false. Also now when using only ‘Basic’ or ‘Digest’ you are no longer redirected to login page. For more info check the AuthComponent page.
  • Property AuthComponent::$authError can be set to boolean false to suppress flash message from being displayed.


  • Authenticating objects now use new password hasher objects for password hash generation and checking. See Hashing passwords for more info.


  • DbAcl now uses INNER joins instead of LEFT joins. This improves performance for some database vendors.



  • Model::save(), Model::saveField(), Model::saveAll(), Model::saveAssociated(), Model::saveMany() now take a new counterCache option. You can set it to false to avoid updating counter cache values for the particular save operation.
  • Model::clear() was added.


  • The Mysql, Postgres, and Sqlserver datasources now support a ‘settings’ array in the connection definition. This key => value pair will be issued as SET commands when the connection is created.
  • The MySQL driver now supports SSL options.



  • JSONP support has been added to JsonView.
  • The _serialize key now supports renaming serialized variables.
  • When debug > 0 JSON will be pretty printed.


  • The _serialize key now supports renaming serialized variables.
  • When debug > 0 XML will be pretty printed.


  • The API for HtmlHelper::css() has been been simplified. You can now provide an array of options as the second argument. When you do, the rel attribute defaults to ‘stylesheet’.
  • New option escapeTitle added to HtmlHelper::link() to control escaping of only link title and not attributes.



  • PaginatorHelper::param() has been added.
  • The first page no longer contains /page:1 or ?page=1 in the URL. This helps prevent duplicate content issues where you would need to use canonical or noindex otherwise.


  • The round option was added to FormHelper::dateTime(). Can be set to up or down to force rounding in either direction. Defaults to null which rounds half up according to interval.



  • CakeRequest::param() has been added.
  • CakeRequest::is() has been modified to support an array of types and will return true if the request matches any type.
  • CakeRequest::isAll() has been added to check that a request matches all the given types.



  • Logged email messages now have the scope of email by default. If you are not seeing email contents in your logs, be sure to add the email scope to your logging configuration.
  • CakeEmail::emailPattern() was added. This method can be used to relax email validation rules. This is useful when dealing with certain Japanese hosts that allow non-compliant addresses to be used.
  • CakeEmail::attachments() now allows you to provide the file contents directly using the data key.
  • Configuration data is now correctly merged with transport classes.




  • ell is now the default locale for Greek as specified by ISO 639-3 and gre its alias. The locale folders have to be adjusted accordingly (from /Locale/gre/ to /Locale/ell/).
  • fas is now the default locale for Farsi as specified by ISO 639-3 and per its alias. The locale folders have to be adjusted accordingly (from /Locale/per/ to /Locale/fas/).
  • sme is now the default locale for Sami as specified by ISO 639-3 and smi its alias. The locale folders have to be adjusted accordingly (from /Locale/smi/ to /Locale/sme/).
  • mkd replaces mk as default locale for Macedonian as specified by ISO 639-3. The corresponding locale folders have to be adjusted, as well.
  • Catalog code in has been dropped in favor of id (Indonesian), e has been dropped in favor of el (Greek), n has been dropped in favor of nl (Dutch), p has been dropped in favor of pl (Polish), sz has been dropped in favor of se (Sami).
  • Kazakh has been added with kaz as locale and kk as catalog code.
  • Kalaallisut has been added with kal as locale and kl as catalog code.
  • The constant DEFAULT_LANGUAGE has been deprecated in favor of Configure value Config.language.


  • Log engines do not need the suffix Log anymore in their setup configuration. So for the FileLog engine it suffices to define 'engine' => 'File' now. This unifies the way engines are named in configuration (see Cache engines for example). Note: If you have a Log engine like DatabaseLogger that does not follow the convention to use a suffix Log for your class name you have to adjust your class name to DatabaseLog. You should also avoid class names like SomeLogLog which include the suffix twice at the end.


  • Two new config options size and rotate have been added for FileLog engine.
  • In debug mode missing directories will now be automatically created to avoid unnecessary errors thrown.


  • The new logging engine SyslogLog was added to stream messages to syslog.



  • In debug mode missing directories will now be automatically created to avoid unnecessary errors thrown.



  • pr() no longer outputs HTML when running in CLI mode.


  • Sanitize class has been deprecated.


  • Validation::date() now supports the y and ym formats.
  • The country code of Validation::phone() for Canada has been changed from can to ca to unify the country codes for validation methods according to ISO 3166 (two letter codes).


  • The currencies AUD, CAD and JPY have been added.
  • The symbols for GBP and EUR are now UTF-8. If you upgrade a non-UTF-8 application, make sure that you update the static $_currencies attribute with the appropriate HTML entity symbols (£ and €) before you use those currencies.
  • The fractionExponent option was added to CakeNumber::currency().



  • New option pretty has been added to Xml::fromArray() to return nicely formatted Xml



  • New configuration option skipLog has been added, to allow skipping certain Exception types to be logged. Configure::write('Exception.skipLog', array('NotFoundException', 'ForbiddenException')); will avoid these exceptions and the ones extending them to be be logged when 'Exception.log' config is true



  • Router::fullBaseUrl() was added together with App.fullBaseUrl Configure value. They replace FULL_BASE_URL which is now deprecated.
  • Router::parse() now parses query string arguments.