触发学说事件
Trigger Doctrine Event
我有一个 preUpdate
Doctrine Event 的事件侦听器,它可以很好地完成工作,但如果请求数据为空,image_data
除外,它不会被触发。它在逻辑上是正确的,因为 Entity
中没有 image_data
列,因此它看不到要更改的字段。这个想法是处理 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
文件名存储在结果中。我相信有更聪明的方法来做到这一点。以前,我对 input/output 使用单个 image
参数,它对 preUpdate
有效,因为有这样的 ORM 列,但是我不喜欢这种方法,因为传入的 image
数据是一个数组(image_name
、image_body
、content_type
和 image_size
),而输出数据类型是字符串(文件名),我决定将它分开(image_data
for POST|PATCH|PUT 和 image
只是结果文件名)。我怎样才能触发 preUpdate
? :)
您可以像这样使用 updatedAt 字段:https://github.com/dustin10/VichUploaderBundle/blob/master/Resources/doc/known_issues.md#the-file-is-not-updated-if-there-are-not-other-changes-in-the-entity
class MyEntitty
{
// ...
/**
* @ORM\Column(type="datetime")
*
* @var \DateTime|null
*/
private $updatedAt;
// ...
public function setSomething($something): void
{
$this->something= $something;
$this->updatedAt = new \DateTime('now');
}
}
我有一个 preUpdate
Doctrine Event 的事件侦听器,它可以很好地完成工作,但如果请求数据为空,image_data
除外,它不会被触发。它在逻辑上是正确的,因为 Entity
中没有 image_data
列,因此它看不到要更改的字段。这个想法是处理 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
文件名存储在结果中。我相信有更聪明的方法来做到这一点。以前,我对 input/output 使用单个 image
参数,它对 preUpdate
有效,因为有这样的 ORM 列,但是我不喜欢这种方法,因为传入的 image
数据是一个数组(image_name
、image_body
、content_type
和 image_size
),而输出数据类型是字符串(文件名),我决定将它分开(image_data
for POST|PATCH|PUT 和 image
只是结果文件名)。我怎样才能触发 preUpdate
? :)
您可以像这样使用 updatedAt 字段:https://github.com/dustin10/VichUploaderBundle/blob/master/Resources/doc/known_issues.md#the-file-is-not-updated-if-there-are-not-other-changes-in-the-entity
class MyEntitty
{
// ...
/**
* @ORM\Column(type="datetime")
*
* @var \DateTime|null
*/
private $updatedAt;
// ...
public function setSomething($something): void
{
$this->something= $something;
$this->updatedAt = new \DateTime('now');
}
}