Symfony - > comment rendre les champs créés et modifiés dynamiques avec la Doctrine?

Je suis nouveau à Symfony2 (ou Symfony3) et je ne trouve pas comment définir doctrine (avec annotations config) pour automatiquement le sauvegarder dans mes entités quand 'créé' ou 'modifié' champs.

22
demandé sur dctremblay 2013-08-16 05:32:23

5 réponses

voici ma solution après ce temps ...

Vous avez juste besoin de mettre cela directement dans votre classe entity :

/**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
class MyEntity {

   //....

    public function __construct() {
        // we set up "created"+"modified"
        $this->setCreated(new \DateTime());
        if ($this->getModified() == null) {
            $this->setModified(new \DateTime());
        }
    }

    /**
     * @ORM\PrePersist()
     * @ORM\PreUpdate()
     */
    public function updateModifiedDatetime() {
        // update the modified time
        $this->setModified(new \DateTime());
    }

    //....    
}

Cela fonctionne bien en fait

37
répondu dctremblay 2014-11-20 19:07:38

Vous pouvez utiliser Stofdoctrine Extensionsbundle. Ceci décrit dans symfony livre de cuisine. Il contient Timestampable comportement.

/**
 * @var datetime $created
 *
 * @Gedmo\Timestampable(on="create")
 * @ORM\Column(type="datetime")
 */
private $created;

/**
 * @var datetime $updated
 *
 * @Gedmo\Timestampable(on="update")
 * @ORM\Column(type="datetime")
 */
private $updated;
23
répondu Alexey B. 2013-08-16 05:51:01
/**
 *
 * @ORM\PrePersist
 * @ORM\PreUpdate
 */
public function updatedTimestamps()
{
    $this->setModifiedAt(new \DateTime(date('Y-m-d H:i:s')));

    if($this->getCreatedAt() == null)
    {
        $this->setCreatedAt(new \DateTime(date('Y-m-d H:i:s')));
    }
}

Vous n'avez pas besoin de faire appel à __constructor n'importe quoi. Il suffit de créer getter et setter propriétés created,modified et c'est tout.

Si vous définissez d'abord setCreated() sur chaque mise à jour vous mettrez à jour aussi created colum. Alors mettez en premier!--8-->

9
répondu Ivan 2016-10-03 12:57:08

deux autres exemples (Si vous utilisez la cartographie Yaml ou Xml):

Entity\Product:
  type: entity
  table: products
  id:
    id:
      type: integer
      generator:
        strategy: AUTO
  fields:
    name:
      type: string
      length: 32
    created_at:
      type: date
      gedmo:
        timestampable:
          on: create
    updated_at:
      type: datetime
      gedmo:
        timestampable:
          on: update

Et xml:

<?xml version="1.0" encoding="UTF-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
                  xmlns:gedmo="http://gediminasm.org/schemas/orm/doctrine-extensions-mapping">

    <entity name="Mapping\Fixture\Xml\Timestampable" table="timestampables">
        <id name="id" type="integer" column="id">
            <generator strategy="AUTO"/>
        </id>

        <field name="created_at" type="datetime">
            <gedmo:timestampable on="create"/>
        </field>
        <field name="updated_at" type="datetime">
            <gedmo:timestampable on="update"/>
        </field>
    </entity>

</doctrine-mapping>
5
répondu NHG 2013-08-16 06:50:17

les autres réponses suggèrent d'utiliser if instructions (ce qui signifie Répéter vos noms de propriétés) et avoir une logique de définition de propriétés dans le constructeur qui pourrait ne jamais être utilisé.

alternativement, vous pourriez avoir onAdd et onUpdate méthodes appelées au besoin:

/**
 * @ORM\PrePersist
 */
public function onAdd()
{
    $this->setAdded(new DateTime('now'));
}

/**
 * @ORM\PrePersist
 * @ORM\PreUpdate
 */
public function onUpdate()
{
    $this->setUpdated(new DateTime('now'));
}
1
répondu rybo111 2017-07-30 12:11:54