doctrine2 – 如何在doctrine 2.1中发布持久化/更新操作,包括重新保存到数据库?

使用doctrine 2.1(以及zend框架1.11,而不是它对这个问题很重要),如何发布持久化和发布更新操作,包括重新保存到数据库

例如,根据刚生成的主键’id创建唯一令牌,或为上传的图像生成缩略图(实际上不需要重新保存到数据库,但仍然)?

编辑 – 让我们解释一下,好吗?

以上实际上是关于两种情况的问题.两种情况都与以下状态有关:

Let’s say I have a User entity. When the object is flushed after it has been marked to be persisted,it’ll have the normal auto-generated id of mysql – meaning running numbers normally beginning at 1,2,3,etc..@H_301_14@ Each user can upload an image – which he will be able to use in the application – which will have a record in the db as well. So I have another entity called Image. Each Image entity also has an auto-generated id – same methodology as the user id.

现在 – 这是场景:

>当用户上传图像时,我想在将图像保存到数据库后立即生成该图像的缩略图.这应该发生在每个新的或更新的图像上.@H_301_14@由于我们试图保持智能,我不希望代码生成缩略图,如下所示:

$image = new Image();@H_301_14@ …@H_301_14@ $entityManager->persist($image);@H_301_14@ $entityManager->flush();@H_301_14@ callToFunctionThatGeneratesThumbnailOnImage($image);

但我希望它在对象的持久化上自动发生(好吧,冲洗持久化对象),就像prePersist或preUpdate方法一样.@H_301_14@>由于用户上传图片,因此他获得了一个图片链接.它可能看起来像:http://www.mysite.com/showImage?id = [IMAGEID].@H_301_14@这允许任何人只需更改此链接中的imageid,并查看其他用户的图像.@H_301_14@所以为了防止这样的事情,我想为每个图像生成一个唯一的标记.因为它实际上并不需要复杂,我想到了使用图像id的md5值和一些盐.@H_301_14@但为此,我需要拥有该图像的ID – 我只有在刷新持久化对象后才会生成 – 然后生成md5,然后再将其保存到数据库中.

了解图像的链接应该是可公开访问的,因此我不能只允许经过身份验证的用户通过某种权限规则查看它们.

解决方法

你可能已经知道 Doctrine events了.你能做什么:

使用postPersist事件处理程序.那个在DB插入之后发生,因此自动生成的id可用.

EventManager类可以帮助您:

class MyEventListener
{
    public function postPersist(LifecycleEventArgs $eventArgs)
    {
        // in a listener you have the entity instance and the 
        // EntityManager available via the event arguments
        $entity = $eventArgs->getEntity();
        $em = $eventArgs->getEntityManager();

        if ($entity instanceof User) {
            // do some stuff
        }

    }
}

$eventManager = $em->getEventManager():
$eventManager->addEventListener(Events::postPersist,new MyEventListener());

一定要检查e. G.如果用户已有Image,否则如果在事件监听器中调用flush,则可能会陷入无限循环.

当然,您也可以使用内联postPersist eventHandler让您的User类知道该图像创建操作,并在映射中添加@HasLifecycleCallbacks,然后始终在请求e的末尾刷新. G.在关机功能,但在我看来这种东西属于一个单独的监听器.因人而异.

如果在刷新之前需要实体id,则在创建对象之后,另一种方法是为应用程序中的实体生成id,例如: G.使用uuids.

现在你可以这样做:

class Entity {
    public function __construct()
    {
        $this->id = uuid_create();
    }
}

现在你刚刚设置了一个id:

$e = new Entity();

而且您只需要在请求结束时调用EntityManager :: flush

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03