Триггер Доктрина Событие - PullRequest
0 голосов
/ 10 января 2019

У меня есть прослушиватель событий для 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)
// ...

Config

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

Entity

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, content_type и image_size), в то время как выходной тип данных - строка (имя файла), и я решил разделить его (image_data для POST | PATCH | PUT, а image - просто имя файла результата). Как я могу вызвать preUpdate? :)

1 Ответ

0 голосов
/ 10 января 2019

Вы можете использовать обновленное поле, например: 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');
    }
}
...