Desaprobación: Doctrine \ ORM \ Mapping \ UnderscoreNamingStrategy sin que el número sea consciente está en desuso

53

Estoy usando Symfony 4.3.8 y no puedo encontrar ninguna información sobre estos desaprobaciones:

Usuario obsoleto: la creación de Doctrine \ ORM \ Mapping \ UnderscoreNamingStrategy sin que su número sea consciente está en desuso y se eliminará en Doctrine ORM 3.0.

La creación de Doctrine \ ORM \ Mapping \ UnderscoreNamingStrategy sin que sea consciente del número está en desuso y se eliminará en Doctrine ORM 3.0.

Busqué en stacktrace y encontré esto:

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

En esta clase, el constructor siempre se llama sin parámetros, por lo que $ numberAware siempre es falso.

Esta clase se llama en un archivo que ha sido generado automáticamente por la Inyección de dependencia de Symfony, por lo que no puedo "editarlo" ...

Pensé que tal vez estaba en 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

Pero no he encontrado ninguna opción para permitir que el número sea consciente :(

leobrl
fuente
3
Simplemente haga un nuevo proyecto 4.4.0 (recién lanzado, sí) y doctrine.yaml tiene "naming_strategy: doctrine.orm.naming_strategy.underscore_number_aware". Intenta ajustar el tuyo.
Cerad

Respuestas:

111

En la mayoría de los casos, solo respondería a este tipo de preguntas con un comentario, pero sospecho que otros desarrolladores podrían encontrarse con este problema. Busqué un poco y no pude encontrar ninguna documentación explícita sobre este tema. Quizás porque DoctrineBundle está bajo el control de Doctrine y no de los desarrolladores de Symfony. O tal vez solo soy un mal buscador.

En cualquier caso, entre 4.3 y 4.4 se cambió el nombre del servicio para la estrategia de nombres de subrayado.

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

Y se agregó un mensaje de depreciación para advertir a los desarrolladores que cambien el nombre. Hubiera sido agradable si el mensaje fuera un poco más explícito, pero bueno. Por lo tanto, si está actualizando una aplicación existente a 4.4 y versiones posteriores, probablemente necesite editar manualmente su archivo doctrine.yaml para que el mensaje de depreciación desaparezca.

Más información (gracias @janh) sobre por qué se realizó el cambio: https://github.com/doctrine/orm/blob/2.8.x/UPGRADE.md#deprecated-number-unaware-doctrineormmappingunderscorenamingstrategy https: // github. com / doctrine / orm / issues / 7855

Todavía no está claro por qué "ellos" eligieron hacer las cosas de esta manera, pero bueno. Probablemente desee ejecutar "bin / console doctrine: schema: update --dump-sql" solo para ver si esto afecta los nombres de columna de su base de datos y ajustar en consecuencia. Los cambios han estado fuera desde hace varias semanas y no parece haber muchos aullidos de indignación por el cambio, así que supongo que la mayoría de los nombres de columna no tienen números incrustados. Hasta ahora al menos.

Cerad
fuente
cambio de estrategia anterior (incorrectamente) por ejemplo $ singleMd5Key a single_payu_md5key y uno nuevo (correctamente) single_payu_md5_key. pero porque eso es cambio BC tenemos todo ese desastre.
Tomek Kobyliński el
@ TomekKobyliński ¿Ha podido encontrar alguna documentación sobre esto además del código mismo? Todavía me cuesta entender por qué la convención de nomenclatura cambiaría (y posiblemente forzaría un cambio en el esquema de la base de datos) cuando llegue Doctrine 3. Simplemente parece que ambos enfoques serían compatibles.
Cerad el
1
Entonces, en lugar de forzar un cambio de esquema de base de datos, ¿tiene que actualizar manualmente sus asignaciones de entidades? No estoy seguro de qué es peor y realmente no aborda la pregunta de por qué cambiar en absoluto. No hay problema con proporcionar una estrategia más "correcta", pero todavía no entiendo por qué la estrategia original está "equivocada" en ningún sentido relevante.
Cerad
1
Vine aquí después de sumergirme en esta depreciación (encontrada al ejecutar phpunit) también. Sería bueno vincular a la receta yaml en la respuesta, ya que eso confirma la solución propuesta: github.com/symfony/recipes/blob/master/doctrine/doctrine-bundle/…
Rvanlaak
1
@ Cerad Hay algo en la información de actualización de la doctrina: github.com/doctrine/orm/blob/2.8.x/… Creo que github.com/doctrine/orm/issues/7855 es el tema relevante.
janh
0

Para aquellos que trabajan con Symfony4.3 y aún quieren que desaparezca esta advertencia, pueden agregar agregar una nueva definición de servicio nueva en service.yaml

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

y cambie la configuración de doctrine.yaml de esta manera:

orm:
    naming_strategy: custom_doctrine_orm_naming_strategy_underscore

antes de seguir adelante confirmando este cambio, le sugiero que verifique que pasar trueal Doctrine\ORM\Mapping\UnderscoreNamingStrategyno afecta el comportamiento esperado de su código.

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

Sugerencia rápida:

pasar trueal c'tor hará que la clase use el en NUMBER_AWARE_PATTERNlugar delDEFAULT_PATTERN

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