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.
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
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;
/**
*
* @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-->
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>
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'));
}