¿Cómo puedo usar atributos php8 en lugar de anotaciones en la doctrina?

2 minutos de lectura

avatar de usuario de glm
glm

Esto es lo que me gustaría usar:

#[ORM\Column(type: "string")]

en lugar de esto:

/**
 *  @ORM\Column(type="string")
 */

Pero estoy recibiendo este error:

(error: Class 'Column' is not annotated with 'Attribute' )

¿Es porque Doctrine aún no lo admite, o me estoy perdiendo algo?

  • ¿Qué caso de uso tiene para necesitar usar anotaciones como esa? ¿Qué estás tratando de resolver?

    – codificador hppy

    23 de marzo de 2021 a las 20:32

  • En caso de que tenga cientos de anotaciones y desee convertirlas en atributos, es posible que prefiera automatizar esto. Escribí una herramienta de código abierto, Rector, que maneja esta actualización por usted: getrector.org/blog/how-to-upgrade-annotations-to-attributes

    – Tomás Votruba

    13 oct 2021 a las 19:22


Avatar de usuario de Denis V
daniel v

Como dice @Seb33300, sí, es ahora es posible en Doctrina ORM 2.9. Pero para Symfony necesitas hacer un poco más que eso. Aquí hay una lista completa de pasos para actualizar:

  1. Actualizar Doctrine ORM: "doctrine/orm": "^2.9".

  2. Paquete de actualización de Doctrine: "doctrine/doctrine-bundle": "^2.4".

  3. Colocar doctrine.orm.mappings.App.type: attribute (por defecto está configurado para annotation):

    # config/packages/doctrine.yaml
    
    doctrine:
      orm:
        mappings:
          App:
            type: attribute
    
  4. Aplique cambios similares a sus entidades:

    --- Dummy.php.old     Mon Jun 07 00:00:00 2021
    +++ Dummy.php         Mon Jun 07 00:00:00 2021
    @@ -7,15 +7,11 @@
     use App\Repository\DummyRepository;
     use Doctrine\ORM\Mapping as ORM;
    
    -/**
    - * @ORM\Entity(repositoryClass = DummyRepository::class)
    - */
    +#[ORM\Entity(repositoryClass: DummyRepository::class)]
     class Dummy
     {
    -    /**
    -     * @ORM\Id
    -     * @ORM\GeneratedValue
    -     * @ORM\Column(type="integer")
    -     */
    +    #[ORM\Id]
    +    #[ORM\GeneratedValue]
    +    #[ORM\Column(type: 'integer')]
         private $id;
     }
    

  • El cambio de “anotación” a “atributo” es fundamental. Gracias por documentarlo.

    -Jason Aller

    10 de junio de 2021 a las 1:06

  • ¿Hay alguna manera de permitir que ambos tengan una migración sin problemas para los atributos existentes?

    – Las nueces

    10 abr a las 16:51

  • @the_nuts ¿Podría encontrar una manera de permitir ambos? Por favor hagamelo saber

    – na

    15 de diciembre a las 12:39

  • @nas sí, creé otro directorio, así que lo que tengo en Entity todavía está con anotación, y lo que tengo en EntAttribs (no pude encontrar un mejor nombre lol) es con atributos: pastebin.com/VS1jGD8x

    – Las nueces

    19 de diciembre a las 14:16

Avatar de usuario de Seb33300
seb33300

EDITAR: Doctrina 2.9 ahora se libera con soporte de atributos de PHP 8!

Las anotaciones de PHP 8 se han fusionado en Doctrine ORM 2.9.x rama que aún no se ha lanzado:
https://github.com/doctrine/orm/pull/8266

Aquí está la referencia de la documentación relacionada con esta característica:
https://www.doctrine-project.org/projects/doctrine-orm/en/current/reference/attributes-reference.html

¿Ha sido útil esta solución?