DoctrineExtensions icon indicating copy to clipboard operation
DoctrineExtensions copied to clipboard

ORM 3 deprecations

Open zorn-v opened this issue 1 year ago • 9 comments

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 : [email protected]
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

zorn-v avatar Jun 25 '24 05:06 zorn-v

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
);

mbabker avatar Jun 25 '24 11:06 mbabker

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

theMadness avatar Jun 25 '24 22:06 theMadness

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 avatar Jun 26 '24 12:06 zorn-v

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

You can do this in App\Kernel constructor for example

zorn-v avatar Jun 26 '24 12:06 zorn-v

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.

mbabker avatar Jun 26 '24 14:06 mbabker

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 )

zorn-v avatar Jun 26 '24 14:06 zorn-v

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.

Jean85 avatar Oct 16 '24 08:10 Jean85

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

zorn-v avatar Oct 17 '24 15:10 zorn-v

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

Jean85 avatar Oct 18 '24 22:10 Jean85

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
);

Maybe it's obvious but I didn't know where to put this code. I added it to tests/bootstrap.php and it worked.

With Symfony Flex, you should already have this file if you use phpunit/phpunit or symfony/phpunit-bridge.

alexislefebvre avatar Dec 02 '24 11:12 alexislefebvre

@alexislefebvre I managed to silence the deprecation by editing src\Kernel.php, extending its constructor

namespace App;

use Doctrine\Deprecations\Deprecation;
use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
use Symfony\Component\HttpKernel\Kernel as BaseKernel;

class Kernel extends BaseKernel
{
    use MicroKernelTrait;

    public function __construct(string $environment, bool $debug)
    {
        parent::__construct($environment, $debug);

        // 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
        );
    }
}

endelwar avatar Dec 03 '24 11:12 endelwar

I added it to tests/bootstrap.php and it worked.

It worked only for tests as this file defined as tests bootstrap in phpunit config by symfony flex

zorn-v avatar Dec 03 '24 14:12 zorn-v