Obsolescence: Doctrine \ ORM \ Mapping \ UnderscoreNamingStrategy sans le rendre conscient du numéro est déconseillé

53

J'utilise Symfony 4.3.8 et je ne trouve aucune information sur ces dépréciations:

Déprécié par l'utilisateur: La création de Doctrine \ ORM \ Mapping \ UnderscoreNamingStrategy sans en rendre le numéro conscient est déconseillée et sera supprimée dans Doctrine ORM 3.0.

La création de Doctrine \ ORM \ Mapping \ UnderscoreNamingStrategy sans le rendre conscient du numéro est déconseillée et sera supprimée dans Doctrine ORM 3.0.

J'ai cherché dans stacktrace et j'ai trouvé ceci:

class UnderscoreNamingStrategy implements NamingStrategy
{
private const DEFAULT_PATTERN      = '/(?<=[a-z])([A-Z])/';
private const NUMBER_AWARE_PATTERN = '/(?<=[a-z0-9])([A-Z])/';

/**
 * Underscore naming strategy construct.
 *
 * @param int $case CASE_LOWER | CASE_UPPER
 */
public function __construct($case = CASE_LOWER, bool $numberAware = false)
{
    if (! $numberAware) {
        @trigger_error(
            'Creating ' . self::class . ' without making it number aware is deprecated and will be removed in Doctrine ORM 3.0.',
            E_USER_DEPRECATED
        );
    }

    $this->case    = $case;
    $this->pattern = $numberAware ? self::NUMBER_AWARE_PATTERN : self::DEFAULT_PATTERN;
}

Dans cette classe, le constructeur est toujours appelé sans param, donc $ numberAware est toujours faux.

Cette classe est appelée dans un fichier qui a été généré automatiquement par Symfony Dependency Injection, donc je ne peux pas le "modifier" ...

Je pensais que c'était peut-être dans doctrine.yaml:

doctrine:
orm:
    auto_generate_proxy_classes: true
    naming_strategy: doctrine.orm.naming_strategy.underscore
    auto_mapping: true
    mappings:
        App:
            is_bundle: false
            type: annotation
            dir: '%kernel.project_dir%/src/Entity'
            prefix: 'App\Entity'
            alias: App

Mais je n'ai trouvé aucune option pour permettre au numéro de connaître :(

leobrl
la source
3
Faites juste un nouveau projet 4.4.0 (tout juste sorti, oui) et doctrine.yaml contient "naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware". Essayez de modifier le vôtre.
Cerad

Réponses:

111

Dans la plupart des cas, je répondrais simplement à ce genre de question avec un commentaire, mais je pense que d'autres développeurs pourraient rencontrer ce problème. J'ai fouillé un peu et je n'ai pas pu trouver de documentation explicite sur ce problème. Peut-être parce que DoctrineBundle est sous le contrôle des gens de Doctrine et non des développeurs Symfony. Ou peut-être que je suis juste un mauvais chercheur.

Dans tous les cas, entre 4.3 et 4.4, le nom du service pour la stratégie de dénomination de soulignement a été modifié.

# doctrine.yaml
orm:
  # 4.3
  naming_strategy: doctrine.orm.naming_strategy.underscore
  # 4.4
  naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware

Et un message de dépréciation a été ajouté pour avertir les développeurs de changer le nom. Cela aurait été bien si le message était juste un peu plus explicite mais bon. Donc, si vous mettez à niveau une application existante vers 4.4 et au-delà, vous devrez probablement modifier manuellement votre fichier doctrine.yaml pour faire disparaître le message de dépréciation.

Quelques informations supplémentaires (merci @janh) sur la raison pour laquelle le changement a été effectué: https://github.com/doctrine/orm/blob/2.8.x/UPGRADE.md#deprecated-number-unaware-doctrineormmappingunderscorenamingstrategy https: // github. com / doctrine / orm / issues / 7855

Je ne sais toujours pas vraiment pourquoi "ils" ont choisi de faire les choses de cette façon, mais bon. Vous souhaiterez probablement exécuter "bin / console doctrine: schema: update --dump-sql" juste pour voir si cela affecte les noms de colonne de votre base de données et ajuster en conséquence. Les changements sont sortis depuis plusieurs semaines maintenant et il ne semble pas y avoir beaucoup de hurlements d'indignation à propos du changement, donc je suppose que la plupart des noms de colonnes n'ont pas de numéros intégrés. Jusqu'à présent au moins.

Cerad
la source
ancien changement de stratégie (à tort), par exemple $ singleMd5Key en single_payu_md5key et nouveau (correctement) single_payu_md5_key. mais parce que c'est le changement BC, nous avons tout ce gâchis.
Tomek Kobyliński
@ TomekKobyliński Avez-vous pu trouver de la documentation à ce sujet en plus du code lui-même? Encore du mal à comprendre pourquoi la convention de nommage changerait (et donc forcerait éventuellement un changement de schéma de base de données) lorsque Doctrine 3 arrivera. Il semble que les deux approches seraient prises en charge.
Cerad
1
Donc, au lieu de forcer un changement de schéma de base de données, vous devez mettre à jour manuellement vos mappages d'entités? Je ne sais pas ce qui est pire et cela ne répond pas vraiment à la question de savoir pourquoi changer du tout. Aucun problème pour fournir une stratégie plus "correcte" mais je ne comprends toujours pas pourquoi la stratégie originale est "fausse" dans un sens pertinent.
Cerad
1
Entré ici après avoir plongé dans cette dépréciation (trouvée en exécutant phpunit) également. Serait bon de faire un lien vers la recette yaml dans la réponse, car cela confirme le correctif proposé: github.com/symfony/recipes/blob/master/doctrine/doctrine-bundle/…
Rvanlaak
1
@Cerad Il y a quelque chose dans les informations de mise à jour de la doctrine: github.com/doctrine/orm/blob/2.8.x/… Je pense que github.com/doctrine/orm/issues/7855 est le problème pertinent.
2019
0

Pour ceux qui travaillent avec symfony4.3 et veulent toujours que cet avertissement disparaisse, vous pouvez ajouter ajouter une nouvelle définition de service dans service.yaml

    custom_doctrine_orm_naming_strategy_underscore:
    class: Doctrine\ORM\Mapping\UnderscoreNamingStrategy
    arguments:
        - 0
        - true

et changez la configuration de doctrine.yaml comme ceci:

orm:
    naming_strategy: custom_doctrine_orm_naming_strategy_underscore

avant de procéder directement à la validation de ce changement, je vous suggère de vérifier que le passage trueà Doctrine\ORM\Mapping\UnderscoreNamingStrategyn'affecte pas le comportement attendu de votre code.

// class UnderscoreNamingStrategy
/**
 * Underscore naming strategy construct.
 *
 * @param int $case CASE_LOWER | CASE_UPPER
 */
public function __construct($case = CASE_LOWER, bool $numberAware = false)
{
    if (! $numberAware) {
        @trigger_error(
            'Creating ' . self::class . ' without making it number aware is deprecated and will be removed in Doctrine ORM 3.0.',
            E_USER_DEPRECATED
        );
    }

    $this->case    = $case;
    $this->pattern = $numberAware ? self::NUMBER_AWARE_PATTERN : self::DEFAULT_PATTERN;
}

Petit conseil:

passer trueau c'tor fera utiliser la classe au NUMBER_AWARE_PATTERNlieu duDEFAULT_PATTERN

private const DEFAULT_PATTERN      = '/(?<=[a-z])([A-Z])/';
private const NUMBER_AWARE_PATTERN = '/(?<=[a-z0-9])([A-Z])/';
nivpenso
la source