Deprecazione: Doctrine \ ORM \ Mapping \ UnderscoreNamingStrategy senza renderlo consapevole del numero è obsoleto


53

Sto usando Symfony 4.3.8 e non riesco a trovare alcuna informazione su tali deprecazioni:

Utente deprecato: la creazione di Doctrine \ ORM \ Mapping \ UnderscoreNamingStrategy senza renderlo consapevole del numero è obsoleta e verrà rimossa in Doctrine ORM 3.0.

La creazione di Doctrine \ ORM \ Mapping \ UnderscoreNamingStrategy senza renderlo consapevole del numero è obsoleta e verrà rimossa in Doctrine ORM 3.0.

Ho cercato in stacktrace e ho trovato questo:

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

In questa classe, il costruttore viene sempre chiamato senza parametri, quindi $ numberAware è sempre falso.

Questa classe viene chiamata nel file che è stato generato automaticamente da Symfony Dependency Injection, quindi non posso "modificarlo" ...

Ho pensato che forse era in dottrine.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

Ma non ho trovato alcuna opzione per consentire al numero di sapere :(


3
Basta fare un nuovo progetto 4.4.0 (appena rilasciato, sì) e doctrine.yaml ha "naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware" in esso. Prova a modificare il tuo.
Cerad,

Risposte:


111

Nella maggior parte dei casi risponderei a questo tipo di domanda con un commento, ma sospetto che altri sviluppatori potrebbero riscontrare questo problema. Ho cercato un po 'in giro e non sono riuscito a trovare alcuna documentazione esplicita su questo problema. Forse perché DoctrineBundle è sotto il controllo della gente di Doctrine e non degli sviluppatori di Symfony. O forse sono solo un cattivo cercatore.

In ogni caso, tra 4.3 e 4.4 è stato modificato il nome del servizio per la strategia di denominazione del carattere di sottolineatura.

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

E un messaggio di ammortamento è stato aggiunto per avvertire gli sviluppatori di cambiare il nome. Sarebbe stato bello se il messaggio fosse solo un po 'più esplicito ma vabbè. Quindi, se stai aggiornando un'app esistente a 4.4 e oltre, probabilmente dovrai modificare manualmente il tuo file doctrine.yaml per far sparire il messaggio di deprezzamento.

Altre informazioni (grazie a @janh) sul perché la modifica è stata apportata: https://github.com/doctrine/orm/blob/2.8.x/UPGRADE.md#deprecated-number-unaware-doctrineormmappingunderscorenamingstrategy https: // github. com / doctrine / orm / temi / 7855

Non è ancora chiaro perché "loro" abbiano scelto di fare le cose in questo modo, ma vabbè. Probabilmente si desidera eseguire "bin / console dottrine: schema: update --dump-sql" solo per vedere se questo influisce sui nomi delle colonne del database e adattarsi di conseguenza. Le modifiche sono in corso da diverse settimane ormai e non sembrano esserci molte urla di indignazione per la modifica, quindi immagino che la maggior parte dei nomi di colonna non abbia numeri incorporati. Almeno finora.


la vecchia strategia cambia (erroneamente) ad esempio $ singleMd5Key in single_payu_md5key e una nuova (correttamente) single_payu_md5_key. ma perché questo è il cambiamento di BC abbiamo tutto quel casino.
Tomek Kobyliński,

@ TomekKobyliński Sei stato in grado di trovare documentazione su questo oltre al codice stesso? Faccio ancora fatica a capire perché la convenzione di denominazione cambierebbe (e quindi possibilmente forzare una modifica dello schema del database) quando arriva Doctrine 3. Sembra proprio che entrambi gli approcci sarebbero supportati.
Cerad,

1
Quindi, invece di forzare una modifica dello schema del database, devi aggiornare manualmente i mapping delle entità? Non sono sicuro di cosa sia peggio e non affronti davvero la questione del perché cambiare affatto. Nessun problema nel fornire una strategia più "corretta", ma ancora non capisco perché la strategia originale sia "sbagliata" in tutti i sensi.
Cerad,

1
È venuto qui dopo essersi tuffato in questa deprecazione (trovata eseguendo phpunit). Sarebbe bene collegarsi alla ricetta yaml nella risposta, poiché ciò conferma la correzione proposta: github.com/symfony/recipes/blob/master/doctrine/doctrine-bundle/…
Rvanlaak

1
@Cerad C'è qualcosa nelle informazioni di aggiornamento di dottrine: github.com/doctrine/orm/blob/2.8.x/… Penso che github.com/doctrine/orm/issues/7855 sia il problema rilevante.
janh

0

Per coloro che lavorano con symfony4.3 e vogliono che questo avviso scompaia, puoi aggiungere aggiungere una nuova definizione di servizio in service.yaml

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

e cambia la configurazione di doctrine.yaml in questo modo:

orm:
    naming_strategy: custom_doctrine_orm_naming_strategy_underscore
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.