У меня есть простая сущность под названием 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++;
}
Как вы, наверное, догадались, в плане событий ничего не происходит. Думаю, его почему-то не выдают.
Что может быть важно - делаю это на уровне функционального теста. Прав ли я, думая, что это причина, по которой я могу заставить это работать?
Вы просматриваете приборы после того, как они уже были сохранены? Или где этот цикл происходит?
@ DirkJ.Faber Если бы тип был проблемой, он бы стонал о неправильном типе. Это всего лишь пример в моем исходном коде: $ this-> createdDateTime = new \ DateTime (); - во всяком случае, это даже не выполняется на основе события. Когда я вызываю persist (), он должен срабатывать и ошибаться или проходить, но он даже не добирается туда
@ Padam87 - нет, Алиса Нельмио Бандл ничего не настаивает. Это моя работа (поправьте меня, если я ошибаюсь). Этот цикл имеет место в моем сервисе для создания фиктивных данных. Я создаю объекты / приспособления с указанным пакетом, а затем пытаюсь сохранить их. Это работает, когда я жестко кодирую некоторые данные, потому что createdDateTime больше не равен нулю. Однако он не хочет использовать событие.
P.S Я также создаю фикстуры задолго до того, как я ввожу и использую EntityManager.
Извините, я давно не пользовался набором Алисы, вы правы. Сохраняются ли они в БД и все такое? Есть ли у вас flush () в конце цикла? В остальном мне все кажется правильным.
Ваш код проходит через ваш оператор if? (if ($counter === self::BATCH_SIZE['MEDIUM'])? Вы пытались сбросить / умереть на этом этапе? В остальном все в порядке.
@ Padam87 Не беспокойся. Да, они попадают в БД, когда данные верны. Он уже работал, однако я пытаюсь улучшить код, автоматически обрабатывая createdDateTime в своих тестах. Я создаю что-то на основе пакета Alice, что значительно упростит функциональное тестирование. Одна из вещей - это простое создание фикстур и тестовых баз данных для ваших тестов. Может быть, в тестах не обрабатываются события?
@ baris1892 - этот бит работает нормально. Я подхожу к петле. Я могу сохранить запись в базе данных, когда есть данные. Проблема в том, что его нет, потому что событие не обрабатывается.
@ Роберт, ты случайно не забыл use Doctrine\ORM\Mapping as ORM;?
@ DirkJ.Faber - нет, это вызовет ошибку намного раньше. Боюсь, это никак не связано с моей проблемой. Скрипт работает нормально. Единственная проблема заключается в том, что поле createdDateTime не заполняется, потому что установщик, который должен запускаться при отправке этого определенного события, вообще не обрабатывается.
@Robert, можешь попробовать использовать свой метод установки $this->setCreatedAt(new \DateTime('now')); вместо $this->createdDateTime = '2018-11-11';? Я предполагаю, что вы создали геттеры и сеттеры.
У меня есть геттеры и сеттеры. Хотя никакой разницы. Я пытался поставить @ORM \ PrePersist () на обоих. Однако фактически они делают то же самое - устанавливают значение createdDateTime. У меня есть то, что вы предлагали в моем первоначальном сеттере. Думаю, я неправильно это объясняю. Проблема не в типе данных. Проблема в том, что свойство не заполняется из-за сбоя Symfony при обработке событий. Это приводит к нулевому значению поля. Проблема в событиях, а не в данных.
@ Роберт, понятно. Может быть, также попробуйте другое событие, например PreUpdate, чтобы убедиться, что оно работает, чтобы убедиться, что оно связано с событием (типом)? Иначе я тоже не понимаю ...
@ DirkJ.Faber не беспокойся. Я тоже пробовал это. Не сработало. Думаю, это ошибка. Я думаю, это потому, что я только что создал своего собственного подписчика на событие, и я могу записать его даже без каких-либо проблем. Я опубликую этот обходной путь как ответ. Может кому поможет.




Таким образом, проблема, похоже, заключается в том, что Symfony не улавливает и не обрабатывает события LifeCycle Doctrine правильно. В этом случае предполагалось вызвать метод по моему выбору для события PrePersist - установщик для $ createdDateTime.
Я использую это в своем функциональном тесте, так что, может быть, проблема здесь? Я не думаю, что раньше вызывал persist (), что могло бы вызвать эту проблему. Мой сценарий также работает должным образом, если предоставлены правильные данные.
Я считаю, что это вина Symfony, потому что, когда я создал своего собственного подписчика на событие PrePersist, я смог фактически обработать это событие.
Это не решение, а обходной путь - создайте своего собственного прослушивателя событий или подписчика и позаботьтесь об этом там.
Разве это не потому, что $ this-> createdDateTime = '2018-11-11' пытается установить строку в поле datetime?