Bug #91200

Extbase DataMapper can not be injected because of QueryInterface constructor dependency

Added by Benjamin Franzke 2 months ago. Updated 2 months ago.

Status:
Closed
Priority:
Should have
Assignee:
-
Category:
Extbase
Start date:
2020-04-26
Due date:
% Done:

100%

TYPO3 Version:
10
PHP Version:
7.2
Tags:
Complexity:
Is Regression:
Sprint Focus:

Description

Found via an extension that used this (@internal) class:
https://travis-ci.org/github/evoWeb/store_finder/jobs/679799189

Note: Despite this is used by an extension, this should still be prepared in core to be usable (in core) at some point and to prevent fatal errors for extension developers.

1) Evoweb\StoreFinder\Tests\Functional\Cache\AddLocationToCacheTest::locationStoredInCacheTable with data set "zip city country only" (array('', '26165', 'City5ea5d495d1643', '', 'Country5ea5d495d1644'), array('zipcode', 'city', 'country'), array('zipcode', 'city', 'country'))
Symfony\Component\DependencyInjection\Exception\RuntimeException: Cannot autowire service "TYPO3\CMS\Extbase\Persistence\Generic\Query": argument "$type" of method "__construct()" has no type-hint, you should configure its value explicitly.
/home/travis/build/evoWeb/store_finder/.Build/Web/vendor/symfony/dependency-injection/Compiler/DefinitionErrorExceptionPass.php:54
/home/travis/build/evoWeb/store_finder/.Build/Web/vendor/symfony/dependency-injection/Compiler/AbstractRecursivePass.php:81
/home/travis/build/evoWeb/store_finder/.Build/Web/vendor/symfony/dependency-injection/Compiler/DefinitionErrorExceptionPass.php:32
/home/travis/build/evoWeb/store_finder/.Build/Web/vendor/symfony/dependency-injection/Compiler/AbstractRecursivePass.php:46
/home/travis/build/evoWeb/store_finder/.Build/Web/vendor/symfony/dependency-injection/Compiler/Compiler.php:91
/home/travis/build/evoWeb/store_finder/.Build/Web/vendor/symfony/dependency-injection/ContainerBuilder.php:734
/home/travis/build/evoWeb/store_finder/.Build/Web/typo3/sysext/core/Classes/DependencyInjection/ContainerBuilder.php:132
/home/travis/build/evoWeb/store_finder/.Build/Web/typo3/sysext/core/Classes/DependencyInjection/ContainerBuilder.php:84
/home/travis/build/evoWeb/store_finder/.Build/Web/typo3/sysext/core/Classes/Core/Bootstrap.php:140
/home/travis/build/evoWeb/store_finder/.Build/Web/vendor/typo3/testing-framework/Classes/Core/Testbase.php:578
/home/travis/build/evoWeb/store_finder/.Build/Web/vendor/typo3/testing-framework/Classes/Core/Functional/FunctionalTestCase.php:330
/home/travis/build/evoWeb/store_finder/Tests/Functional/Cache/AddLocationToCacheTest.php:48

In this case static_info_tables was patched to contain a DI configuration and injected DataMapper, which then caused symfony DI to inspect the nullable query parameter.

This currently works in core, because a) DataMapper is never injected – it is always retrieved from the Extbase ObjectManager/Container and because b) Extbase does not inject optional arguments, while symfony DI tries to.

While it is not supported that extensions inject
this internal service, we should still fix it, because the
exception is a) hard to debug und b) core may inject it in
future.


Related issues

Related to TYPO3 Core - Task #87305: Use constructor injection in DataMapper Closed 2018-12-30

Associated revisions

Revision 3c6d295a (diff)
Added by Benjamin Franzke 2 months ago

[TASK] Provide dependency injection configuration for extbase DataMapper

The extbase DataMapper was changed to use constructor based
dependency injection with change #87305. The argument $query
(of type QueryInterface) was set to a nullable
and way therefore ignored by the Extbase ObjectManager.

This class is currently only used via the Extbase ObjectManager
in core. It was therefore excluded from the symfony dependency
injection and therefore never fataled during symfony DI
container build.

Symfony DI does – in contrast to extbase DI – inject nullable
constructor arguments.
That means:
Once core or an extension starts to inject this service,
injection will fail, as QueryInterface points to the Query object
which is not autowirable. (see exception below)

Note: While it is not supported that extensions inject
this internal service, we still fix this case, because the
exception is a) hard to debug und b) core may inject it in
future.

The service is also declarted to be a prototype (shared: false) as it may
contain state, as set via `setQuery`.

[1] exception thrown by symfonyduring DI compilation:
Symfony\Component\DependencyInjection\Exception\RuntimeException:
Cannot autowire service "TYPO3\CMS\Extbase\Persistence\Generic\Query":
argument "$type" of method "__construct()" has no type-hint,
you should configure its value explicitly.

Releases: master
Resolves: #91200
Related: #87305
Change-Id: I58b1cff94136a4170fb7e6712470069a141940b7
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/64319
Tested-by: TYPO3com <>
Tested-by: Sebastian Fischer <>
Tested-by: Alexander Schnitzler <>
Reviewed-by: Sebastian Fischer <>
Reviewed-by: Alexander Schnitzler <>

History

#1 Updated by Benjamin Franzke 2 months ago

  • Related to Task #87305: Use constructor injection in DataMapper added

#2 Updated by Gerrit Code Review 2 months ago

  • Status changed from New to Under Review

Patch set 1 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/64319

#3 Updated by Benjamin Franzke 2 months ago

  • Status changed from Under Review to Resolved
  • % Done changed from 0 to 100

#4 Updated by Benni Mack 2 months ago

  • Status changed from Resolved to Closed

Also available in: Atom PDF