Symfony prepersist не работает

Как работать с обратным вызовом жизненного цикла¶

Иногда вам может понадобиться выполнить действия прямо до или после вставки, обновления или удаления сущности. Такие типы событий известны как обратные вызовы «жизненного цикла», так как они являются методами обратного вызова, которые вам нужно выполнить во время разных стадий жизненного цикла сущности (например, когда сущность вставляется, обновляется, удаляется и т.д.).

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

Теперь вы можете сказать Doctrine применить метод к любым доступным событиям жизненного цикла. Например, представьте, что вы хотите сделать так, чтобы в столбце дат createdAt появлялась текущая дата только тогда, когда сушность спервые сохраняется (т.е. вставляется):

Вышеприведенный пример предполагает, что вы создали и отобразили свойство createdAt (здесь не показано).

Теперь, прямо перед тем, как сущность будет впервые сохраняться, Doctrine автоматически вызовет этот метод и в поле createdAt будет установлена текущая дата.

Существуют ещё некототорые другие события жизненного цикла, к которым это можно применить. Чтобы узнать больше информации о других событиях жизненного цикла и обратном вызове жизненного цикла в общем, см. Документацию событий жизненного цикла Doctrine.

Callback жизненного цикла и слушатели событий

Заметьте, что метод setCreatedAtValue() не принимает никаких аргументов. Так всегда происходит с обратным вызововм жизненного цикла и это намеренно: callbacks жизненного цикла должны быть простыми методами, которые заняты внутренней трансформацией данных в сущности (например, установка созданного/обновлённого поля, создание значения slug).

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

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.

Источник

Symfony4 PrePersist не срабатывает

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

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

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

Читайте также:  Asus rog g752vt не работает подсветка клавиатуры

Я бы
название
Эл. адрес
отметка времени

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

Что у меня не так?

3 ответа

Попробуй, мне это очень нравится: /** * 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(); > >

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

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

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

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

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

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

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

и вы можете использовать TimestampableEntity в вашей сущности, как это.

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

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

в services.yaml добавить

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

Источник

Symfony2 ORM prePersist Не Работает

prePersist() метод моей сущности не вызывается.

Вот мой код Form/UsersType.php

Я закомментировал эти три поля активными, созданными и измененными, чтобы не отображать их в форме.

Но я получаю ошибку:

Чего мне не хватает в сущности?

Стек Trace

5 ответов

Две сущности GalleryAlbum и GalleryImage имеют отношение OneToMany/ManyToOne: One GalleryAlbum ==== can have ====> Many GalleryImage Many GalleryImage === can be in ===> One GalleryAlbum (источники ниже) В чем проблема? Добавление (загрузка) файлов в GalleryAlbum $em->persist($album).

У меня есть проблема с реализацией Doctrine EventListener. При создании нового счета-фактуры существует набор товаров (Название, Цена, Сумма), который включается в форму InvoiceType . Для счета-фактуры в поле price я хочу вставить сумму всех купленных продуктов. В ReportListener я получаю сумму.

Читайте также:  Телевизор lg 22lh2000 как настроить цифровые каналы

У меня та же проблема. Согласно документам, вы должны включить обратные вызовы жизненного цикла http://symfony.com/doc/current/book/doctrine.html

Я решил эту проблему, очистив кэш!

Одна из проблем заключается в этой функции.

Вы не можете передавать аргументы функциям при использовании @PrePersist .

Также эта функция

не удается, потому что вы присваиваете строковое значение полям DateTime. Попробуйте это:

У меня была та же проблема, потому что мой метод был частным, поэтому убедитесь, что метод с аннотацией @ORM\PrePersist() является общедоступным.

@ORM\PrePersist отсутствует скобка, она должна быть @ORM\PrePersist()

Похожие вопросы:

У меня возникли некоторые проблемы с lifecyclecallbacks в symfony. Вот моя сущность: Many GalleryImage Many GalleryImage === can be in ===> One GalleryAlbum.

У меня есть проблема с реализацией Doctrine EventListener. При создании нового счета-фактуры существует набор товаров (Название, Цена, Сумма), который включается в форму InvoiceType . Для.

Я новичок в Symfony2 и хотел бы знать, в чем разница между событиями prePersist и preUpdate. Похоже, что prePersist — это ‘fired’ перед I ‘persist’ записью, но когда срабатывает preUpdate?

Я использую Doctrine 2 с ZF2 и Doctrine-модулем. Я написал сущность, которая нуждается в PreUpdate/PrePersist, потому что Doctrine не позволяет Дата|Datetime в первичном ключе:

Источник

Symfony2: PrePersist/PreUpdate lifecycle-event not fired

Two Entities GalleryAlbum and GalleryImage have OneToMany/ManyToOne relationship:

One GalleryAlbum ==== can have ====> Many GalleryImage

Many GalleryImage === can be in ===> One GalleryAlbum

What is the problem?

Adding (uploading) files to GalleryAlbum

For each uploaded file GalleryAlbum class creates and adds to $images a new GalleryImage entity

My ECHO/EXIT test is not shown (GalleryImage’s prePersist/preUpdate event callback function named preUpload is not triggered!)

My new images are not saved to the database? Why?

What is weird! If I do:

Adding (uploading) files

again $em->flush()

My ECHO/EXIT test is shown (GalleryImage’s prePersist/preUpdate event callback function named preUpload is triggered!)

(if i delete echo/exit) My new GalleryImages are saved now.

Why?

Why is preUpload never triggered when I flush() once, and is triggered when I flush() twice?

1 Answer 1

The first time you call persist doctrine will only save $album and not its images. You must specify that you want doctrine to cascade the persist by specifying it in the $images declaration:

Читайте также:  Дуалшок 4 не работает гироскоп

This way when you call persist($album) it will also persist your images and should trigger preUpload in your GalleryImage. There are a few different options available for cascading and they are explained well here:

Источник

Doctrine Events

Doctrine, the set of PHP libraries used by Symfony to work with databases, provides a lightweight event system to update entities during the application execution. These events, called lifecycle events, allow to perform tasks such as “update the createdAt property automatically right before persisting entities of this type”.

Doctrine triggers events before/after performing the most common entity operations (e.g. prePersist/postPersist , preUpdate/postUpdate ) and also on other common tasks (e.g. loadClassMetadata , onClear ).

There are different ways to listen to these Doctrine events:

  • Lifecycle callbacks, they are defined as public methods on the entity classes and they are called when the events are triggered;
  • Lifecycle listeners and subscribers, they are classes with callback methods for one or more events and they are called for all entities;
  • Entity listeners, they are similar to lifecycle listeners, but they are called only for the entities of a certain class.

These are the drawbacks and advantages of each one:

  • Callbacks have better performance because they only apply to a single entity class, but you can’t reuse the logic for different entities and they don’t have access to Symfony services ;
  • Lifecycle listeners and subscribers can reuse logic among different entities and can access Symfony services but their performance is worse because they are called for all entities;
  • Entity listeners have the same advantages of lifecycle listeners and they have better performance because they only apply to a single entity class.

This article only explains the basics about Doctrine events when using them inside a Symfony application. Read the official docs about Doctrine events to learn everything about them.

This article covers listeners and subscribers for Doctrine ORM. If you are using ODM for MongoDB, read the DoctrineMongoDBBundle documentation.

Источник

Оцените статью