mardi 27 mai 2014

Ajouter un champ de type Base64 à Symfony2 / Doctrine

Symfony2, qui utilise Doctrine, offre par défaut la majorité des types de champ dont on a besoin.

Cependant, le bundle DoctrineBundle permet d'ajouter des types de champ intéressants, dont base64.

Ce type de champ sauvegardera la version Base64 de la valeur de votre champ, et décodera cette valeur lors de la lecture de la base de données.

4 commentaires:

  1. Tu peux aussi jouer avec les événements de Doctrine PostLoad et PrePersist si c'est une chose ponctuelle et propre à un nombre réduit d'entités

    RépondreSupprimer
  2. C'est possible, effectivement. Seulement je préfère avoir un type de champ qui gère ça automatiquement, plutôt que de devoir coder des listeners qui feront toujours le même travail.

    De plus, postLoad est appelé sans avoir chargé les liens entre les entités, donc si ton entité A a un champ de type base64, une entité B liée à A peut y avoir accès. Si tu passes par les listeners, alors B n'aura pas accès à la vraie valeur de A dans ces fameux listeners.

    RépondreSupprimer
  3. Pas du tout sur de ce que tu avances car il semblerait logique que ses événements s’exécute a chaque chargement de l'entité (avec l'utilisation de @ORM/HasLifeCycle).

    RépondreSupprimer
  4. Exactement, postLoad sera appelé pour l'entité A et pour l'entité B. Mais quand il sera appelé pour A, n'importe quelle liaison avec B (oneToMany etc) ne sera pas chargée, et ce sera pareil quand on sera dans postLoad pour B.

    Crois-moi, je me suis cassé la tête sur ce problème avec Guillaume que tu as vu dans les commentaires. Et je n'ai pas trouvé de solution technique fournie pour avoir un event quand l'entité est "réellement complètement chargée", j'entends avec ses liaisons.

    C'est retrouvable dans la doc : http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/events.html#lifecycle-events (lit le petit carré jaune en dessous de tous les events)

    RépondreSupprimer