doctrine-extensions / DoctrineExtensions

Doctrine2 behavioral extensions, Translatable, Sluggable, Tree-NestedSet, Timestampable, Loggable, Sortable
MIT License
4.05k stars 1.27k forks source link

ORM 3 deprecations #2827

Open zorn-v opened 5 months ago

zorn-v commented 5 months ago

Environment

Package

show

``` $ composer show --latest gedmo/doctrine-extensions name : gedmo/doctrine-extensions descrip. : Doctrine behavioral extensions keywords : Blameable, behaviors, doctrine, extensions, gedmo, loggable, nestedset, odm, orm, sluggable, sortable, timestampable, translatable, tree, uploadable versions : * v3.16.0 released : 2024-06-24, this week latest : v3.16.0 released 2024-06-24, this week type : library license : MIT License (MIT) (OSI approved) https://spdx.org/licenses/MIT.html#licenseText homepage : http://gediminasm.org/ source : [git] https://github.com/doctrine-extensions/DoctrineExtensions.git 7832a3059bdaf14433a2a2515d533c6a16e58520 dist : [zip] https://api.github.com/repos/doctrine-extensions/DoctrineExtensions/zipball/7832a3059bdaf14433a2a2515d533c6a16e58520 7832a3059bdaf14433a2a2515d533c6a16e58520 path : /mnt/M.2/Develop/mark/prokat/prokat/vendor/gedmo/doctrine-extensions names : gedmo/doctrine-extensions support email : gediminas.morkevicius@gmail.com issues : https://github.com/doctrine-extensions/DoctrineExtensions/issues source : https://github.com/doctrine-extensions/DoctrineExtensions/tree/v3.16.0 wiki : https://github.com/Atlantic18/DoctrineExtensions/tree/main/doc autoload psr-4 Gedmo\ => src/ requires behat/transliterator ^1.2 doctrine/collections ^1.2 || ^2.0 doctrine/common ^2.13 || ^3.0 doctrine/deprecations ^1.0 doctrine/event-manager ^1.2 || ^2.0 doctrine/persistence ^2.2 || ^3.0 php ^7.4 || ^8.0 psr/cache ^1 || ^2 || ^3 psr/clock ^1 symfony/cache ^5.4 || ^6.0 || ^7.0 requires (dev) doctrine/annotations ^1.13 || ^2.0 doctrine/cache ^1.11 || ^2.0 doctrine/dbal ^3.2 doctrine/doctrine-bundle ^2.3 doctrine/mongodb-odm ^2.3 doctrine/orm ^2.14.0 || ^3.0 friendsofphp/php-cs-fixer ^3.14.0 nesbot/carbon ^2.71 || ^3.0 phpstan/phpstan ^1.11 phpstan/phpstan-doctrine ^1.4 phpstan/phpstan-phpunit ^1.4 phpunit/phpunit ^9.6 rector/rector ^1.1 symfony/console ^5.4 || ^6.0 || ^7.0 symfony/doctrine-bridge ^5.4 || ^6.0 || ^7.0 symfony/phpunit-bridge ^6.0 || ^7.0 symfony/uid ^5.4 || ^6.0 || ^7.0 symfony/yaml ^5.4 || ^6.0 || ^7.0 suggests doctrine/mongodb-odm to use the extensions with the MongoDB ODM doctrine/orm to use the extensions with the ORM conflicts doctrine/annotations <1.13 || >=3.0 doctrine/dbal <3.2 || >=4.0 doctrine/mongodb-odm <2.3 || >=3.0 doctrine/orm <2.14.0 || 2.16.0 || 2.16.1 || >=4.0 ```

Doctrine packages

show

``` $ composer show --latest 'doctrine/*' Direct dependencies required in composer.json: doctrine/dbal 3.8.6 4.0.4 Powerful PHP database abstraction layer... doctrine/doctrine-bundle 2.12.0 2.12.0 Symfony DoctrineBundle doctrine/doctrine-migrations-bundle 3.3.1 3.3.1 Symfony DoctrineMigrationsBundle Transitive dependencies not required in composer.json: doctrine/cache 2.2.0 2.2.0 PHP Doctrine Cache library is a popular... doctrine/collections 2.2.2 2.2.2 PHP Doctrine Collections library that a... doctrine/common 3.4.4 3.4.4 PHP Doctrine Common project is a librar... doctrine/deprecations 1.1.3 1.1.3 A small layer on top of trigger_error(E... doctrine/event-manager 2.0.1 2.0.1 The Doctrine Event Manager is a simple ... doctrine/inflector 2.0.10 2.0.10 PHP Doctrine Inflector is a small libra... doctrine/instantiator 2.0.0 2.0.0 A small, lightweight utility to instant... doctrine/lexer 3.0.1 3.0.1 PHP Doctrine Lexer parser library that ... doctrine/migrations 3.7.4 3.7.4 PHP Doctrine Migrations project offer a... doctrine/orm 3.2.0 3.2.0 Object-Relational-Mapper for PHP doctrine/persistence 3.3.3 3.3.3 The Doctrine Persistence project is a s... doctrine/sql-formatter 1.4.0 1.4.0 a PHP SQL highlighting library ```

PHP version

$ php -v

PHP 8.2.18 (cli) (built: Apr 11 2024 19:20:54) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.2.18, Copyright (c) Zend Technologies
    with Zend OPcache v8.2.18, Copyright (c), by Zend Technologies

Subject

After update to latest (3.16.0) version which support ORM 3 there are deprecations appear in symfony debug toolbar.

User Deprecated: Using ArrayAccess on Doctrine\ORM\Mapping\FieldMapping is deprecated and will not be possible in Doctrine ORM 4.0. Use the corresponding property instead. (ArrayAccessImplementation.php:31 called by AbstractAnnotationDriver.php:134, https://github.com/doctrine/orm/pull/11211, package doctrine/orm)

https://github.com/doctrine-extensions/DoctrineExtensions/blob/c1c245573a3c4081bc626b9132059652a93463fd/src/Tree/Mapping/Validator.php#L100

https://github.com/doctrine-extensions/DoctrineExtensions/blob/c1c245573a3c4081bc626b9132059652a93463fd/src/Mapping/Driver/AbstractAnnotationDriver.php#L134

etc

mbabker commented 5 months ago

This is expected behavior right now as a deprecation-free environment would require either dropping ORM 2.x support or adding way too many version checks to the code to avoid them. You can silence these deprecations through Doctrine's deprecations library with this:

use Doctrine\Deprecations\Deprecation;

// Ignore unfixable Doctrine deprecations
Deprecation::ignoreDeprecations(
    'https://github.com/doctrine/orm/pull/11211', // The ORM changed from arrays to named data objects in 3.x, some packages still use array access for B/C
);
theMadness commented 5 months ago

Any idea of how to implement this suppression while using StofDoctrineExtensionsBundle?

zorn-v commented 5 months ago

either dropping ORM 2.x support or adding way too many version checks to the code to avoid them

Or just search/replace like $mapping['type'] to $mapping->type ?? $mapping['type']

zorn-v commented 5 months ago

Any idea of how to implement this suppression while using StofDoctrineExtensionsBundle?

You can do this in App\Kernel constructor for example

mbabker commented 5 months ago

either dropping ORM 2.x support or adding way too many version checks to the code to avoid them

Or just search/replace like $mapping['type'] to $mapping->type ?? $mapping['type']

While it looks that simple, it adds a lot of maintenance overhead. A fair number of the uses of the mapping data is in code that runs for both the MongoDB ODM and ORM. ClassMetadata::getFieldMapping() isn't part of the persistence interface, so a consistent type contract doesn't exist. The ODM and ORM 2.x use an array and ORM 3.x uses an object that implements ArrayAccess and triggers deprecations when using array access. The simplest solution right now is to just leave the deprecated array access in place; eventually, someone is going to need to go through all 38 uses of $meta->getFieldMapping() and figure out the context they run in and what the best way to deal with the different type structures is going to be, but given that it's just a deprecation notice and not something that's causing applications to not work (and I get how annoying deprecations can be, I've got dozens of them in the main Symfony application I work on that are unfixable), it's not an extremely urgent thing to address at the moment.

zorn-v commented 5 months ago

Yeah, I'm so brave decided to make pull request :smile: Then I found that it is not so simple.

Maybe use "BC promise", increase major version and cleanup array access then ?

About ODM - just need to kick they )

Jean85 commented 1 month ago

The ODM and ORM 2.x use an array and ORM 3.x uses an object that implements ArrayAccess and triggers deprecations when using array access.

I'm probably missing something here, but... doesn't $mapping->type ?? $mapping['type'] avoid triggering the array access if the property is present, hence avoiding both deprecations?

https://3v4l.org/X018d vs https://3v4l.org/NEdul shows how it's a totally doable approach.

zorn-v commented 1 month ago

It avoid, but it is not so simple "find & replace" Need more brave soldier than I )

Jean85 commented 1 month ago

I did a first attempt to solving this, at least partially, with #2889