Migrando Doctrine - ODM a 2.16.X (solucionando problemas de pérdida de datos)

Enviado por christian el

Estas cosillas que voy a comentar en este post son las típicas que realmente no te aportan nada de conocimiento extra pero que si las supieras hace unos días, te ahorrarías bastante tiempo de debug y análisis de porqué todo falla.... jaja

 

Qué ocurre ¿?

Pues en mi caso te lo resumo bastante sencillo:

  • Symfony actualizado a versión 7.4.X (LTS)
  • PHP 8.4
  • ODM 2.16.X
  • No hay errores de complicación ni de mapeo ni de configuración
  • Al realizar los flujos de trabajo (casos de uso de la aplicación), se producen comportamientos muy muy raros:
    • Borrado de datos (crítico)
    • Pérdida de relaciones entre entidades (grave)

 

Por qué ocurre esto ¿?

Pues después de mucho mucho mucho leer y hacer pruebas, parece ser que el principal problema es: "Native lazy objects (enable_native_lazy_objects)" + "VarExporter LazyGhost (enable_lazy_ghost_objects)"

Esta es la combinación que produce el problema y es porque los "lazy objects" están depreciados en la 2.16 y ya no estará disponible en 3.X por lo que su funcionamiento ya no es aconsejable y además, la opción de "VarExport" (generar los ficheros de mapeo de ODM para cachear) funciona... no muy bien por decirlo de alguna forma... jaja

Esto hace que, los ficheros de mapeo de campos se generan con estructura e información incorrecta y hace que tu aplicación haga cosas "raras". Y si además de esto, le sumamos que estos ficheros se guardan en caché, estos errores se extienden de forma indefinida (porque aún que limpies caché, se regeneran automáticamente)

 

La solución ¿?

Pues la solución es bastante sencilla (cuando la encuentras claro...) Básicamente es quitar los lazy_objects y usar los proxy_classes. Esto mejor explicado sería:

  • Deshabilitamos el uso de los "lazy_objects" que son de versiones antiguas y están "deprecated"
  • Habilitamos el uso de "proxy_classes" que es lo que usa las nuevas versiones

Básicamente, el cambio se aplica directamente en el fichero "doctrine_mongodb.yaml", por lo que no afecta a nada de código. Solo config:

doctrine_mongodb:                                                                                                                                                                                 
	auto_generate_proxy_classes: '%kernel.debug%'
    auto_generate_hydrator_classes: '%kernel.debug%'                                                                                                                                               
    enable_native_lazy_objects: false                                                                                                                                                              
    enable_lazy_ghost_objects: true                                                                                                                                                                
    
    connections:                                                                                                                                                                                   
    	default:                                                                                                                                                                                   
    		server: '%env(MONGODB_URL)%'  
    		.
    		.
    		.

 

Y hasta aquí! Ya veis que la solución es bastante sencilla pero para encontrarla..... pues me ha costado! jaja

Dinahosting: dominios y alojamiento web
My investor

Regístrate en MyInvestory tendrás un extra de 20€ ! :D

 

Menciona que vienes de mi parte y te llevas un regalo en tu primera inversión :)

Usa el código U048395 y te llevas un regalo en tu primera inversión :)

 

Usa el código 22c80f y te llevas un regalo en tu primera inversión :)