【问题标题】:PreUpdate event listener crashes the sitePreUpdate 事件侦听器使站点崩溃
【发布时间】:2013-08-02 19:39:44
【问题描述】:

我正在尝试构建一个 preUpdate,我正在使用 postUpdate 进行此操作,但我没有考虑到这样一个事实,即无论何时编辑该实体,无论字段如何,我都会更改...所以我阅读我应该改用 preUpdate...

这是我的更新前监听器:

namespace Prizes\PrizesBundle\EventListener;

use Doctrine\ORM\Event\LifecycleEventArgs;
use Prizes\PrizesBundle\Entity\Prize;
use Prizes\CatalogBundle\Entity\CatalogHasPrize as CHP;

/**
 * Description of DeactivatePrizesInCatalog
 *
 * @author Victoria Noguera
 * Desactiva premios en catalogos cuando se desactiven en el prize central.
 */
/**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
class DeactivatePrizesInCatalog {
/**
     * @ORM\PrePersist()
     * @ORM\PreUpdate()
     */
    public function preUpdate(LifecycleEventArgs $args) {
       $entity = $args->getEntity();
        $entityManager = $args->getEntity

Manager();
    if ($entity instanceof Prize) {
        if ($args->hasChangedField('status')) {
            $status_new = $args->getNewValue('status');
            if ($status_new->getName() == "Inactive") {
                $statusinactive = $entityManager->getRepository('AppStatusBundle:Status')->find(8);
                $q = $entityManager->createQuery("UPDATE CatalogBundle:CatalogHasPrize c SET c.status = :statusid WHERE c.status = 7 AND c.prize = :prizeid")
                        ->setParameters(array('statusid' => $statusinactive, 'prizeid' => $entity->getId()));
                $rs = $q->getResult();
            } else if ($status_new->getName() == "Active") {
                $statusinactive = $entityManager->getRepository('AppStatusBundle:Status')->find(7);
                $q = $entityManager->createQuery("UPDATE CatalogBundle:CatalogHasPrize c SET c.status = :statusid WHERE c.status = 8 AND c.prize = :prizeid")
                        ->setParameters(array('statusid' => $statusinactive, 'prizeid' => $entity->getId()));
                $rs = $q->getResult();
            }
        }
    }
}

}

这就是我在 config.yml 文件中执行的方式(我只是在 services.yml 中读到它,但我稍后会更改它)

services:
    preupdate.listener:
        class: Prizes\PrizesBundle\EventListener\DeactivatePrizesInCatalog
        tags: 
             - { name: doctrine.event_listener , event: preUpdate }

但是,当我执行此操作时,我的项目从功能齐全变为 503 服务不可用。即使我只是写public function preUpdate(LifecycleEventArgs $args) { } 它崩溃了,我假设一个配置问题,但我不知道我做错了什么。

如果能提供任何帮助,我将不胜感激。谢谢你

【问题讨论】:

  • 错误日志中的错误是什么?

标签: symfony doctrine-orm event-listener http-status-code-503


【解决方案1】:

您正在向本身不是实体的侦听器添加映射信息:

/**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */

和...

/**
 * @ORM\PrePersist()
 * @ORM\PreUpdate()
 */

... 不能在您的侦听器类中。

如果实体本身包含 prePersist 方法,则可以在实体中使用这些注释。

【讨论】:

  • symfony 的日志文件说什么app\logs\dev.log ...如果您在其中找不到任何东西,请检查 php 和 webserver 日志文件。离开那些不需要的注释是第一步:) 重要...你清除缓存了吗?
  • 不是 symfony 日志文件、apache 或 nginx 日志文件。他们会准确地说出问题所在。 503 错误看起来像 serverissue 而不是 sf 问题
  • Apache 日志文件没有与该项目相关的任何内容。
  • 如果您对侦听器文件运行php -l 会发生什么? ...只是为了澄清..如果您使用 # 评论侦听器配置(或暂时将其删除)...并清除缓存...您的网站可以完美运行吗?
  • 嗨,是的,如果我评论它的监听器配置它工作。它可以在我的本地服务器上正常使用当前配置。开发日志没有任何内容,生产日志也没有。 php -l 表示没有检测到语法错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
相关资源
最近更新 更多