symfony - 触发教义事件
问题描述
我有一个 Doctrine Event 的事件监听器,preUpdate
它可以很好地完成这项工作,但如果请求数据为空 except image_data
,它不会被触发。这在逻辑上是正确的,因为 中没有image_data
列Entity
,因此它看不到要更改的字段。这个想法是处理image_data
数组,然后进行图像上传,最后将文件名存储到image
ORM 列,如果请求中存在其中一个字段,则该列有效。让我展示我的代码:
控制器
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_type
image_size
image_data
image
preUpdate
解决方案
您可以使用如下所示的 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');
}
}
推荐阅读
- python - reCAPTCHA Selenium 和 Buster 交互
- apache-kafka - 如何查找两个对象是否已接近一段时间
- python - 如何在列表中查找重复值并修改它们?
- javascript - Reactjs:setstate 渲染顺序问题
- python - 为什么我不能在 pPython 的类中腌制嵌套的字典或列表?
- spring - Spring Boot - 执行器指标端点在 docker 映像中不起作用
- apache-kafka - 多个主题流监听器kafka之间通信出错 | 未从 .properties 文件中获取应用程序 ID
- java - 如何使用 mp3 文件完全退出活动
- c++ - 是否使用 std::atomic fetch_add 的结果来索引数组仍然是原子的?
- r - 在 R 中绘制 (beta) 曲线