Reprovação: Doctrine \ ORM \ Mapping \ UnderscoreNamingStrategy sem informar o número está obsoleto

53

Estou usando o Symfony 4.3.8 e não consigo encontrar nenhuma informação sobre essas preterições:

Usuário descontinuado: a criação de Doctrine \ ORM \ Mapping \ UnderscoreNamingStrategy sem informar o número está obsoleta e será removida no Doctrine ORM 3.0.

Criar Doctrine \ ORM \ Mapping \ UnderscoreNamingStrategy sem informar seu número é reprovado e será removido no Doctrine ORM 3.0.

Eu procurei no stacktrace e encontrei o seguinte:

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

Nesta classe, o construtor é sempre chamado sem parâmetros, portanto, $ numberAware é sempre falso.

Essa classe é chamada em um arquivo que foi gerado automaticamente pela Injeção de Dependência do Symfony, então não posso "editá-la" ...

Eu pensei que talvez estivesse na doutrina.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

Mas não encontrei nenhuma opção para permitir o número ciente :(

leobrl
fonte
3
Basta fazer um novo projeto 4.4.0 (recém-lançado, sim) e o doctrine.yaml possui "naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware" nele. Tente ajustar o seu.
Cerad 21/11/19

Respostas:

111

Na maioria dos casos, eu apenas respondia esse tipo de pergunta com um comentário, mas suspeito que outros desenvolvedores possam ter esse problema. Eu bisbilhotei um pouco e não consegui encontrar nenhuma documentação explícita sobre esse assunto. Talvez porque o DoctrineBundle esteja sob o controle do pessoal do Doctrine e não dos desenvolvedores do Symfony. Ou talvez eu seja apenas um mau pesquisador.

De qualquer forma, entre 4,3 e 4,4, o nome do serviço para a estratégia de nomeação de sublinhado foi alterado.

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

E uma mensagem de depreciação foi adicionada para avisar os desenvolvedores para alterar o nome. Teria sido bom se a mensagem fosse um pouco mais explícita, mas tudo bem. Portanto, se você estiver atualizando um aplicativo existente para 4.4 e além, provavelmente precisará editar manualmente seu arquivo doctrine.yaml para que a mensagem de depreciação desapareça.

Mais algumas informações (obrigado @janh) sobre o motivo da alteração: https://github.com/doctrine/orm/blob/2.8.x/UPGRADE.md#deprecated-number-unaware-doctrineormmappingunderscorenamingstrategy https: // github. com / doutrina / orm / edições / 7855

Ainda não está muito claro por que "eles" escolheram fazer as coisas dessa maneira, mas tudo bem. Provavelmente, você deseja executar "bin / console doctrine: schema: update --dump-sql" apenas para ver se isso afeta os nomes das colunas do banco de dados e ajustar de acordo. As mudanças estão em vigor há várias semanas e não parece haver muitos gritos de indignação com a mudança, então acho que a maioria dos nomes de colunas não tem números incorporados. Até agora, pelo menos.

Cerad
fonte
mudança de estratégia antiga (incorretamente), por exemplo, $ singleMd5Key para single_payu_md5key e nova (corretamente) single_payu_md5_key. mas porque essa é a mudança de BC, temos toda essa bagunça.
Tomek Kobyliński
@ TomekKobyliński Você conseguiu encontrar alguma documentação sobre isso além do próprio código? Ainda lutando para entender por que a convenção de nomenclatura mudaria (e, portanto, possivelmente forçaria uma alteração no esquema do banco de dados) quando a Doutrina 3 chegar. Parece que ambas as abordagens seriam suportadas.
Cerad 26/11/19
11
Então, em vez de forçar uma alteração no esquema do banco de dados, você precisa atualizar manualmente seus mapeamentos de entidade? Não tenho certeza do que é pior e realmente não aborda a questão de por que mudar. Não há problema em fornecer uma estratégia mais "correta", mas ainda não entendo por que a estratégia original está "errada" em qualquer sentido relevante.
Cerad 27/11/19
11
Veio aqui depois de mergulhar nessa depreciação (encontrada ao executar o phpunit) também. Seria bom link para o yaml receita na resposta, como que confirma a correção proposta: github.com/symfony/recipes/blob/master/doctrine/doctrine-bundle/...
Rvanlaak
11
@Cerad Há algo nas informações de atualização da doutrina: github.com/doctrine/orm/blob/2.8.x/… Acho que github.com/doctrine/orm/issues/7855 é a questão relevante.
janh