CreatedAtListener.php 1.3 KB

1234567891011121314151617181920212223242526272829303132333435
  1. <?php
  2. namespace PhpDevCommunity\PaperORM\EventListener;
  3. use PhpDevCommunity\PaperORM\Event\PreCreateEvent;
  4. use PhpDevCommunity\PaperORM\Mapper\ColumnMapper;
  5. use PhpDevCommunity\PaperORM\Mapping\Column\Column;
  6. use PhpDevCommunity\PaperORM\Mapping\Column\TimestampColumn;
  7. class CreatedAtListener
  8. {
  9. public function __invoke(PreCreateEvent $event)
  10. {
  11. $entity = $event->getEntity();
  12. foreach (ColumnMapper::getColumns($entity) as $column) {
  13. if ($column instanceof TimestampColumn && $column->isOnCreated()) {
  14. $property = $column->getProperty();
  15. $method = "set" . ucfirst($property);
  16. if (method_exists($entity, $method)) {
  17. $entity->$method(new \DateTimeImmutable('now'));
  18. } elseif (array_key_exists($property, get_object_vars($entity))) {
  19. $entity->$property = new \DateTimeImmutable('now'); // OK car public
  20. } else {
  21. throw new \LogicException(sprintf(
  22. 'Cannot set created-at timestamp: expected setter "%s()" or a public property "%s" in entity "%s".',
  23. $method,
  24. $property,
  25. get_class($entity)
  26. ));
  27. }
  28. }
  29. }
  30. }
  31. }