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