Doctrine2 - это неправильно использовать прослушиватели событий для изменения статуса объекта? - PullRequest
0 голосов
/ 18 ноября 2018

Вопрос по шаблонам проектирования.

Я использую 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);
    }
}
...