首页 > 解决方案 > 触发教义事件

问题描述

我有一个 Doctrine Event 的事件监听器,preUpdate它可以很好地完成这项工作,但如果请求数据为空 except image_data,它不会被触发。这在逻辑上是正确的,因为 中没有image_dataEntity,因此它看不到要更改的字段。这个想法是处理image_data数组,然后进行图像上传,最后将文件名存储到imageORM 列,如果请求中存在其中一个字段,则该列有效。让我展示我的代码:

控制器

public function patch($id, Request $request)
{
    $data = $request->request->all();
    $company = $this->repo->find($id);
    $form = $this->createForm(CompanyType::class, $company);
    $form->submit($data, false);
    if (false === $form->isValid()) {
        // error
    }
    $this->em->flush();
    // success
}

形式

// ...
->add('image_data', Types\TextType::class)
->add('image', Types\TextType::class)
// ...

配置

# ...
- { name: doctrine.event_listener, event: preUpdate }

实体

trait UploadableTrait
{
    /**
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    private $image;

    /**
     * @Exclude()
     */
    private $image_data = [];

到目前为止我是如何解决它的 - 在BeforeActionSubscriber我将image属性设置为1因此preUpdate被触发,上传被处理并将真实image文件名存储在结果中。我相信有更聪明的方法。以前,我使用单个image参数进行输入/输出,它之所以有效preUpdate,是因为有这样的 ORM 列,但是我不喜欢这种方法,因为传入image的数据是一个数组(image_name、、和) image_body,而输出数据类型是字符串(文件名)我决定将它分开(对于 POST|PATCH|PUT 并且只是结果文件名)。我该如何触发?:)content_typeimage_sizeimage_dataimagepreUpdate

标签: symfonydoctrinesymfony4

解决方案


您可以使用如下所示的 updatedAt 字段:https ://github.com/dustin10/VichUploaderBundle/blob/master/Resources/doc/known_issues.md#the-file-is-not-updated-if-there-are-not -实体中的其他更改

class MyEntitty
{
    // ...

    /**
     * @ORM\Column(type="datetime")
     *
     * @var \DateTime|null
     */
    private $updatedAt;

    // ...

    public function setSomething($something): void
    {
        $this->something= $something;
        $this->updatedAt = new \DateTime('now');
    }
}

推荐阅读