Вопрос по шаблонам проектирования.
Я использую doctrine2 для проекта, который имеет сущность, которая имеет статус, давайте назовем его «entityWithStatus». Когда этот объект меняет свой статус, я хочу, чтобы другие объекты могли прослушивать это изменение и в этом случае создать новый logPost. Я прочитал документацию о слушателях событий, и мне кажется, что это именно то, что мне нужно, НО, но когда я захотел сохранить новую сущность в слушателе, это не сработало. Код слушателя выполняется, но данные не сохраняются в объекте, в сообщениях об ошибках говорится, что «никакие параметры не были связаны», даже если все данные были установлены. Я добавил «хакерское» решение, сообщив единице работы, что изменения сделаны. Я читал темы с симметричными проблемами здесь о переполнении стека, но ни один из них не вызывает вопросов, если это правильно. Я наблюдал, как Марко Пиветта говорит о лучших примерах в Учении , и он говорит, что «избегайте обратных вызовов жизненного цикла», и это действительно смущает меня. Я вижу слушателей событий как подписки в шаблоне публикации / подписки, но, возможно, я ошибаюсь?
Мой вопрос: я что-то упустил? эта логика должна быть в другом слое? Мы используем шаблон хранилища / службы в этом проекте. Может быть, мне следует добавить подписчиков в хранилище, а затем добавить метод setStatus (), который вызывает подписчиков при вызове?
Пример кода:
/**
* @Entity
* @EntityListeners({"myEventListener"})
* @Table(name="entityWithStatus")
* @HasLifecycleCallbacks
*/
class entityWithStatus {
/** @Id
* @Column(type="integer")
* @GeneratedValue
* @var int
**/
public $id;
/**
* @Column(type="integer", length=11)
* @var int
**/
public $status;
}
Пример сущности logPost.
/**
* @Entity
* @Table(name="logPosts")
*/
class logPost {
// logPost entity
}
Слушатель событий создает новый logPost каждый раз, когда «entityWithStatus» меняет статус.
class myEventListener {
public function preFlush(entityWithStatus $entityWithStatus, PreFlushEventArgs $event) {
$log = new logPost();
$log->setText('Status changed: ' . $entityWithStatus->getStatus());
$entityManager = $event->getEntityManager();
$entityManager->persist($log);
// Hacky solution to tell unit of work about the changes
$metaData = $entityManager->getClassMetadata('logPost');
$entityManager->getUnitOfWork()->computeChangeSet($metaData, $trustcruitModel);
}
}