Breaking Changes

We are trying to keep breaking changes to a minimum. Nevertheless there will be some changes that might break your existing extensions, especially if you interacted with classes/methods that are not part of the Public API.
Here is a list of the most profound changes. For a more complete list please refer to the Extbase Changelog and the Fluid Changelog
Hint: Always keep an eye on your deprecation log (located at typo3conf/deprecation_*.log if enabled) and upgrade your code in case you're using deprecated classes/functions.

From Extbase 4.7 to Extbase 6.0

Extbase

  • FrontendUser->isOnline: The property isOnline of FrontendUser with its getter and setter was removed, because there is no TCA definition for column is_online.
    Thus the property was not getting filled with data from database in mappping process.

Fluid

  • Naming of Fluid Templates: As of version 6.0 all Fluid template filenames must begin with an uppercase letter. So if your action is called sendEmail the corresponding Fluid template needs to be named SendEmail.html. Lowercase Fluid template filenames were deprecated for a long time and finally removed in 6.0
  • Removed RenderFlashMessagesViewHelper: The Fluid ViewHelper RenderFlashMessagesViewHelper was removed after being deprecated for some versions. Please use FlashMessagesViewHelper instead.

From Extbase 1.4 to Extbase 4.7

Extbase

  • A registered slot now gets the signal's information (classname::name) by default set as last parameter in the arguments array. You can avoid this by setting passSignalInformation to FALSE in your connect()-call.

From Extbase 1.3.x to Extbase 1.4.0

Extbase:

  • The Property Mapper of FLOW3 has been reworked and backported to Extbase. The new property mapper is very configurable and extensible. Because this is a breaking change, the new behavior is disabled by default. You can activate it for your new Extensions with plugin.tx_[yourExtensionName].features.rewrittenPropertyMapper = 1
  • The Validation API has also changed, but this is only a breaking change if you do NOT subclass AbstractValidator, but implement ValidatorInterface yourself. In this case, you need to adjust your custom validator to support the new API.
  • The action resolving mechanism has been adjusted slightly and an exception is thrown when a controller/action is requested that is not configured to be supported by the current plugin. With the option plugin.tx_[yourExtensionName].mvc.throwPageNotFoundExceptionIfActionCantBeResolved = 1 you can force Extbase to display the TYPO3 404 page not found page instead.
    With Extbase 1.4.1 there will be a new option mvc.callDefaultActionIfActionCantBeResolved that can be set in order to disable the exception and fall back to the default controller/action if an invalid action was requested.

Fluid:

  • AbstractViewHelper::arguments are no longer an object but an array. If you used $this->arguments->hasArgument() in your custom ViewHelpers, you'll have to replace this with $this->hasArgument().
  • With Fluid 1.4 you can use {_all} inside your template to access all variables available right now. This is only a breaking change if you used a variable _all inside your own templates.
  • Fluid templates, layouts and partials are now compiled with the first rendering. This increases performance and decreases memory consumption extensively. This should not be a breaking change as the cache is automatically regenerated whenever the Fluid file changes.
    If you still want to disable Fluid compilation for debugging purposes, you can do so by disabling the cache with $GLOBALS['TYPO3_CONF_VARS']['SYS']['caching']['cacheConfigurations']['fluid_template']['backend'] = 't3lib_cache_backend_NullBackend';

From Extbase 1.2.x to Extbase 1.3.0

  • We now have Dependency Injection in Extbase. This should work seamlessly in most cases. However, if you used your own Dependency Injection approach within your extension, you might have to adjust the code slightly. See Dependency Injection (DI) for more information.
  • Tx_Extbase_Dispatcher is now deprecated. The new entry point for Extbase extensions is Tx_Extbase_Core_Bootstrap (analogical to \F3\FLOW3\Core\Bootstrap in FLOW3). Nevertheless, in order to stay backwards compatible Tx_Extbase_Dispatcher will stay in Extbase until version 1.5.0.
    See Dispatcher Refactoring for more information.
  • Tx_Extbase_Persistence_QueryInterface::execute() now returns an object of type QueryResultInterface instead of an array. The QueryResult implements the interfaces Countable, Iterator and ArrayAccess and should therefore behave like an array (you can use it in loops and use the count() function on it).
    Due to a bug in PHP you can't use the array_* functions on the QueryResult though. That applies to the current() function too, which people used to return the first result. Instead you should use the method getFirst() on the QueryResult. See QueryResult.
  • The ConfigurationManager has been reworked. As it was not part of the Public API this should not be a breaking change to you. Anyways, if you were referring to the ConfigurationManager in your extensions, you most probably have to adjust your code. See ConfigurationManager rework
  • Flashmessages are now stored in the improved t3lib_FlashMessageQueue internally now. The API is still the same, but a side-effect is, that the message queue is now handled globally per request. This probably won't affect a lot of users though as Flashmessages are usually only outputted as result of some user input. See Flashmessages rework
  • The UriBuilder now uses the current cObject instead of creating a new instance in the constructor. This is a breaking change if you instantiated the UriBuilder in your code and passed in a cObject. Please use the Extbase ObjectManager or inject the ConfigurationManager manually.
  • the link.external now adds by default HTTP:// in front of links, if missing. This is a breaking change if you have links to HARD Coded Pages on the same Server and your uri was like "/some/other/stuff.html" without Domainname. Fix it by adding defaultScheme='' to your <f:link.external /> command.

From Extbase 1.0.2 to Extbase 1.2.0

  • $query->execute() now returns a plain array of row-arrays instead of an RowIterator. This is a breaking change if you use your own Query object in combination with $querySettings->getRawQueryResult = TRUE.
  • It's now possible to edit localized domain models in the FE. Changes will be stored to the correct database row. This changes the behavior of mapping the uid to DomainObjects. The uid is now the "real" uid of the localized database tuple instead of the sys_language_parent. This may influence the $_GET parameters of cached pages as the uid is often part of the URI. Resolves #4639.
  • Fluid template filenames are expected to be UpperCamelCased from now on. For a grace period (until version 1.5.0) there is still a fallback mechanism, so that your old template filenames will still work. But you should rename your templates from "myaction.html" to "MyAction.html" to make sure, that it still works in upcoming versions of Fluid!