optimization - zend框架2+学说: removing media with related Entity

标签 optimization doctrine-orm entity zend-framework2 media

我已使用 Doctrine2 设置了 ZF2 骨架应用程序。我的目标是创建具有简单层次结构的简单新闻服务。

  Category -> News -> Media (file)

我已经为类别、新闻和媒体设置了所有必需的关系(即,如果新闻被删除,所有相关媒体都会从数据库中删除)。

问题是媒体指向某个文件(位于文件存储中)。我实现了简单的功能,删除与新闻相关的所有媒体,然后删除新闻本身。

  $news->deleteImg();
  $this->getEntityManager()->remove($news);
  $this->getEntityManager()->flush();

感觉这是错误的方法

有没有一种方法可以将删除文件函数绑定(bind)到媒体实体,每次直接或通过其父级删除媒体时都会自动调用该函数? (即新闻或类别)

最佳答案

找到解决方案。

这很简单:

首先在Media类之前添加注解

/**
 * Media
 *
 * @ORM\Table(name="media")
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks  <- Add this line
 */
class Media

然后您需要为类添加 2 个函数 PreRemovePostRemove

/**
 * @ORM\PreRemove()
 */
public function storeFilenameForRemove()
{
    $this->temp = realpath($this->path);
}    

/**
 * @ORM\PostRemove()
 */
public function removeImg()
{
    if (isset($this->temp)) {
        unlink($this->temp);
    }        
}

此函数将被触发:第一次在删除之前(用于存储文件名),第二次在实体从数据库中删除以删除相关文件之后。

您还需要定义

private $temp;

存储文件名。

就是这样。现在,当您删除新闻或新闻类别时,所有相关媒体文件都将与其实体一起删除。

关于optimization - zend框架2+学说: removing media with related Entity,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17549733/

相关文章:

optimization - 编译器优化的限制是什么?它有多聪明?

php - 我如何使用 php 处理大的 mysql 表进行登录验证

c - C 编译器能够跨目标文件进行优化吗?

doctrine-orm - 如何在Doctrine2中的YML中创建唯一约束?

php - 如何清除或清空 doctrine symfony 中的 Array Collection

performance - Delphi 2009 中的 sqrt 仍然很慢吗?

entity-framework - Doctrine 和多实体关联

mysql - 如何使用 MySQL(如 SqlBulkCopy)和 Linq to Entities 进行批量插入

java - 使用集合更新实体的 JPA 最佳实践

c++ - C++库的可维护性