Обратные вызовы Symfony 4 Simple Lifecycle не работают

У меня есть простая сущность под названием Post.

/**
 * Class Post
 * @package App\Entity
 *
 * @ORM\Entity(repositoryClass = "App\Repository\Blog\PostRepository")
 * @ORM\Table(name = "posts")
 * @ORM\HasLifecycleCallbacks()
 *
 */
class Post
{ 
    /**
     * @var \DateTime
     * @ORM\Column(type = "datetime", options = {"default":"CURRENT_TIMESTAMP"})
     */
    protected $createdDateTime;

    /**
     * @ORM\PrePersist()
     */
    public function testEvent()
    {
        $this->createdDateTime = '2018-11-11';
        //dump(123); exit; this is not working either
    }
}

Теперь я использую Nelmio Alice Bundle для создания некоторых фикстур базы данных, и когда я закончу с этим, я просматриваю их, чтобы сохранить то, что у меня есть в базе данных.

foreach($this->fixtures as $fixture) {
    $this->entityManager->persist($fixture);
    if ($counter === self::BATCH_SIZE['MEDIUM']) {
        $this->entityManager->flush();
        $this->entityManager->clear();
    }
    counter++;
} 

Как вы, наверное, догадались, в плане событий ничего не происходит. Думаю, его почему-то не выдают.

Что может быть важно - делаю это на уровне функционального теста. Прав ли я, думая, что это причина, по которой я могу заставить это работать?

Разве это не потому, что $ this-> createdDateTime = '2018-11-11' пытается установить строку в поле datetime?

Dirk J. Faber 18.11.2018 00:16

Вы просматриваете приборы после того, как они уже были сохранены? Или где этот цикл происходит?

Padam87 18.11.2018 00:19

@ DirkJ.Faber Если бы тип был проблемой, он бы стонал о неправильном типе. Это всего лишь пример в моем исходном коде: $ this-> createdDateTime = new \ DateTime (); - во всяком случае, это даже не выполняется на основе события. Когда я вызываю persist (), он должен срабатывать и ошибаться или проходить, но он даже не добирается туда

Robert 18.11.2018 00:19

@ Padam87 - нет, Алиса Нельмио Бандл ничего не настаивает. Это моя работа (поправьте меня, если я ошибаюсь). Этот цикл имеет место в моем сервисе для создания фиктивных данных. Я создаю объекты / приспособления с указанным пакетом, а затем пытаюсь сохранить их. Это работает, когда я жестко кодирую некоторые данные, потому что createdDateTime больше не равен нулю. Однако он не хочет использовать событие.

Robert 18.11.2018 00:22

P.S Я также создаю фикстуры задолго до того, как я ввожу и использую EntityManager.

Robert 18.11.2018 00:30

Извините, я давно не пользовался набором Алисы, вы правы. Сохраняются ли они в БД и все такое? Есть ли у вас flush () в конце цикла? В остальном мне все кажется правильным.

Padam87 18.11.2018 00:37

Ваш код проходит через ваш оператор if? (if ($counter === self::BATCH_SIZE['MEDIUM'])? Вы пытались сбросить / умереть на этом этапе? В остальном все в порядке.

baris1892 18.11.2018 00:41

@ Padam87 Не беспокойся. Да, они попадают в БД, когда данные верны. Он уже работал, однако я пытаюсь улучшить код, автоматически обрабатывая createdDateTime в своих тестах. Я создаю что-то на основе пакета Alice, что значительно упростит функциональное тестирование. Одна из вещей - это простое создание фикстур и тестовых баз данных для ваших тестов. Может быть, в тестах не обрабатываются события?

Robert 18.11.2018 00:44

@ baris1892 - этот бит работает нормально. Я подхожу к петле. Я могу сохранить запись в базе данных, когда есть данные. Проблема в том, что его нет, потому что событие не обрабатывается.

Robert 18.11.2018 00:44

@ Роберт, ты случайно не забыл use Doctrine\ORM\Mapping as ORM;?

Dirk J. Faber 18.11.2018 00:47

@ DirkJ.Faber - нет, это вызовет ошибку намного раньше. Боюсь, это никак не связано с моей проблемой. Скрипт работает нормально. Единственная проблема заключается в том, что поле createdDateTime не заполняется, потому что установщик, который должен запускаться при отправке этого определенного события, вообще не обрабатывается.

Robert 18.11.2018 00:50

@Robert, можешь попробовать использовать свой метод установки $this->setCreatedAt(new \DateTime('now')); вместо $this->createdDateTime = '2018-11-11';? Я предполагаю, что вы создали геттеры и сеттеры.

Dirk J. Faber 18.11.2018 01:02

У меня есть геттеры и сеттеры. Хотя никакой разницы. Я пытался поставить @ORM \ PrePersist () на обоих. Однако фактически они делают то же самое - устанавливают значение createdDateTime. У меня есть то, что вы предлагали в моем первоначальном сеттере. Думаю, я неправильно это объясняю. Проблема не в типе данных. Проблема в том, что свойство не заполняется из-за сбоя Symfony при обработке событий. Это приводит к нулевому значению поля. Проблема в событиях, а не в данных.

Robert 18.11.2018 01:05

@ Роберт, понятно. Может быть, также попробуйте другое событие, например PreUpdate, чтобы убедиться, что оно работает, чтобы убедиться, что оно связано с событием (типом)? Иначе я тоже не понимаю ...

Dirk J. Faber 18.11.2018 01:10

@ DirkJ.Faber не беспокойся. Я тоже пробовал это. Не сработало. Думаю, это ошибка. Я думаю, это потому, что я только что создал своего собственного подписчика на событие, и я могу записать его даже без каких-либо проблем. Я опубликую этот обходной путь как ответ. Может кому поможет.

Robert 18.11.2018 01:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
15
667
1

Ответы 1

Таким образом, проблема, похоже, заключается в том, что Symfony не улавливает и не обрабатывает события LifeCycle Doctrine правильно. В этом случае предполагалось вызвать метод по моему выбору для события PrePersist - установщик для $ createdDateTime.

Я использую это в своем функциональном тесте, так что, может быть, проблема здесь? Я не думаю, что раньше вызывал persist (), что могло бы вызвать эту проблему. Мой сценарий также работает должным образом, если предоставлены правильные данные.

Я считаю, что это вина Symfony, потому что, когда я создал своего собственного подписчика на событие PrePersist, я смог фактически обработать это событие.

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

Другие вопросы по теме