Symfony4 PrePersist не срабатывает - PullRequest
0 голосов
/ 16 мая 2019

Я тестирую PrePersist и другие события в Symfony4 и Doctrine.

Вот мой контроллер

<?php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use App\Entity\Contact;
class C00260CallbackController extends AbstractController
{
    /**
     * @Route("/c00260/callback", name="c00260_callback")
     */
    public function index()
    // Callback statements are in the Entity definition
    {
        $entityManager = $this->getDoctrine()->getManager();
        $contact = new Contact();
        $contact->setName('Elodie');
        $contact->setEmail('elodie@email.com');
        //$contact->setTimestamp();
        $entityManager->persist($contact);
        $entityManager->flush();
                return $this->render('c00260_callback/index.html.twig', [
            'controller_name' => 'C00260CallbackController',
        ]);
    }
}

и моя сущность

<?php
namespace App\Entity;
/**
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 * @ORM\HasLifecycleCallbacks()
 */
use Doctrine\ORM\Mapping as ORM;
/**
 * @ORM\Entity(repositoryClass="App\Repository\ContactRepository")
 */
class Contact
{
    /**
     * @ORM\PrePersist
     */
    public function setTimestamp()
    {
        $this->timestamp = new date('Y-m-d H:i:s');
        return $this;
        dumpx($this->timestamp);
    }
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;
    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name;
    /**
     * @ORM\Column(type="string", length=255)
     */
    private $email;
    public function getId(): ?int
    {
        return $this->id;
    }
    public function getName(): ?string
    {
        return $this->name;
    }
    public function setName(string $name): self
    {
        $this->name = $name;
        return $this;
    }

    public function getEmail(): ?string
    {
        return $this->email;
    }
    public function setEmail(string $email): self
    {
        $this->email = $email;
        return $this;
    }
}

Контакт таблицы имеетвсе обязательные поля

id
имя
электронная почта
метка времени

Когда я запускаю контроллер, я должен получить текущие дату и время в поле даты и времени, но не тольконичего не происходит, но функция setTimestamp даже не вызывается (когда в нее помещается ошибка, она не видна при выполнении)

Что я не так делаю?

Ответы [ 4 ]

1 голос
/ 15 июня 2019

Попробуйте, это очень хорошо работает для меня: /** * Callback called every time you create a new object * @ORM\PrePersist() * @ORM\PreUpdate * @return Response */ public function prePersist() { if (empty($this->createdAt)) { $this->createdAt = new \DateTime(); } }

и поместите его в свою сущность после параметров

0 голосов
/ 17 мая 2019

Вы можете использовать этот пакет StofDoctrineExtensionsBundle.И активируйте расширения по своему усмотрению.

в конфигурации yaml вы можете активировать метку времени.

stof_doctrine_extensions:
    default_locale: en_US
    orm:
        default:
            timestampable: true

, и вы можете использовать TimestampableEntity в вашей сущности следующим образом.


namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\TokenRepository")
 * @ORM\Table(name="tokens")
 */
class Token
{
    use TimestampableEntity;

    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;
}

поэтому он будет автоматически обновлять поля даты updated_at и creation_at.:)

но если вы хотите сделать прослушиватель событий для другого поля.Вы можете создать этот слушатель следующим образом.

в services.yaml add

   App\EventListener\EntityListener:
        tags:
            - {name: doctrine.event_subscriber}

Создайте каталог EventListener в папке src и напишите своему слушателю вот так

<?php

namespace App\EventListener;

use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Event\LifecycleEventArgs;

class EntityListener implements EventSubscriber
{
    /**
     * @var EntityManagerInterface $em
     */
    private $em;

    /**
     * EntityListener constructor.
     * @param EntityManagerInterface $em
     */
    public function __construct(EntityManagerInterface $em)
    {
        $this->em = $em;
    }

    public function prePersist(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();

        if ($entity instanceof SomeEntity) {
            //do somthing 
        }
    }

    /**
     * {@inheritdoc}
     */
    public function getSubscribedEvents()
    {
        return ['prePersist'];
    }
}
0 голосов
/ 21 мая 2019

Может быть, вы сможете установить метку времени в __construct () методе вашей сущности

__construct(){
$this->timestamp = new \Datetime();

}

0 голосов
/ 16 мая 2019

Почему вы делаете это таким сложным, почему бы просто не установить значение по умолчанию для datetime в конструкторе вашей сущности.Таким образом, каждый инициализированный Контакт получает дату автоматически, и вы всегда можете легко ее переопределить.

Если вы этого не хотите, я бы рекомендовал настроить прослушиватель сущностей отдельно, иначе ваша сущность станет слишком раздутой,трудно поддерживать.

Надеюсь, я немного помог, спросите, если у вас есть вопросы

...