Project

General

Profile

Actions

Bug #93911

open

Cannot strong-type properties when extending a domain model

Added by Xavier Perseguers over 3 years ago. Updated 5 months ago.

Status:
Needs Feedback
Priority:
Should have
Assignee:
-
Category:
Extbase
Target version:
-
Start date:
2021-04-13
Due date:
% Done:

0%

Estimated time:
TYPO3 Version:
10
PHP Version:
7.4
Tags:
Complexity:
Is Regression:
Sprint Focus:

Description

In the context of using Configuration/Extbase/Persistence/Classes.php, Extbase allows to extend a domain model, e.g.:

namespace VENDOR\MyExt\Domain\Model;

class User extends FrontendUser
{

    /**
     * @var string
     */
    protected $courseStudy;

    // getter/setter

Corresponding definition looks like:

return [
    \TYPO3\CMS\Extbase\Domain\Model\FrontendUser::class => [
        'tableName' => 'fe_users',
        'recordType' => '\TYPO3\CMS\Extbase\Domain\Model\FrontendUser',
        'subclasses' => [
            'Tx_MyExt_User' => \VENDOR\MyExt\Domain\Model\User::class,
        ]
    ],
    \VENDOR\MyExt\Domain\Model\User::class => [
        'tableName' => 'fe_users',
        'properties' => [
            'courseStudy' => [
                'fieldName' => 'tx_myext_course_study'
            ],
        ],
    ],
];

This way the mapping just works fine!

However if you strong type the property, then it doesn't work anymore:

namespace VENDOR\MyExt\Domain\Model;

class User extends FrontendUser
{

    /**
     * @var string
     */
    protected string $courseStudy;

    // getter/setter

(mind the protected string).

Actions #1

Updated by Guido Schmechel about 3 years ago

We also had problems with the extbase persistence classes today. It was not so much the string notation, but we were still missing a TCA passthrough to the name of the original field.

Actions #2

Updated by Christian Kuhn almost 3 years ago

  • Status changed from New to Closed

This does not work on PHP level. This is invalid:

class foo {
    protected $foo;
}
class bar extends foo {
    protected string $foo;
}

Quoting https://wiki.php.net/rfc/typed_properties_v2:

"Property types are invariant. This means that the type of a (non-private) property is not allowed to change during inheritance (this includes adding or removing property types). If the parent property is private, then the type may be changed arbitrarily.
[...]
As such, neither contravariance nor covariance are applicable to property types.
"

Actions #3

Updated by Xavier Perseguers almost 3 years ago

  • Status changed from Closed to New

This was not about overriding an existing property but adding another property.

Actions #4

Updated by Benni Mack 5 months ago

  • Status changed from New to Needs Feedback

Xavier Perseguers wrote in #note-3:

This was not about overriding an existing property but adding another property.

Hey Xavier,

this works for me in v12 installation (extending EXT:news). Does it work for you in v11+ ?

Actions

Also available in: Atom PDF