Deprecation: #100071 - Magic repository findBy() methods

See forge#100071

Description

Extbase repositories come with a magic __call()-method to allow calling the following methods without implementing:

  • findBy[PropertyName]($propertyValue)

  • findOneBy[PropertyName]($propertyValue)

  • countBy[PropertyName]($propertyValue)

These have now been marked as deprecated, as they are "magic", meaning that proper IDE support is not possible, and other PHP-related tooling functionality such as PHPStorm.

In addition, with the magic methods, it is not possible for Extbase repositories to build their own magic method functionality, as the logic is already in use.

Impact

As these methods are widely used in almost all Extbase-based extensions, they are marked as deprecated in TYPO3 v12, but will only trigger a deprecation notice in TYPO3 v13, as they will be removed in TYPO3 v14.

This way, the migration towards the new API methods can be taken without pressure.

Affected installations

All installations with third-party extensions that use those magic methods.

Migration

A new set of methods without all those downsides have been added:

  • findBy(array $criteria, ...): QueryResultInterface

  • findOneBy(array $criteria, ...):object|null

  • count(array $criteria, ...): int

The naming of those methods follows those of doctrine/orm and only count() differs from the formerly countBy(). While all magic methods only allow for a single comparison (propertyName = propertyValue), those methods allow for multiple comparisons, called constraints.

findBy[PropertyName]($propertyValue) can be replaced with a call to findBy:

$this->blogRepository->findBy(['propertyName' => $propertyValue]);

findOneBy[PropertyName]($propertyValue) can be replaced with a call to findOneBy:

$this->blogRepository->findOneBy(['propertyName' => $propertyValue]);

countBy[PropertyName]($propertyValue) can be replaced with a call to count:

$this->blogRepository->count(['propertyName' => $propertyValue]);