symfony - Symfony 动态表单 - 从嵌入式表单获取文件给出 NULL
问题描述
我有一个动态表单,它FileType
根据另一个字段值(链接)显示/隐藏一个字段。当我试图在我的控制器中获取文件时,它总是给我NULL
我的用户类型:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('familyStatus', ChoiceType::class, [
'label' => 'Statut de famille',
'label_attr' => [
'class' => 'fg-label'
],
'attr' => [
'class' => 'sc-gqjmRU fQXahQ'
],
'required' => true,
'choices' => [
'Married' => 'M',
'Single' => 'S'
]
]);
$formModifier = function (FormInterface $form, $status = null) {
if ($status === 'M') {
$form->add('familyInfo', FamilyInfoType::class);
}
};
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) use ($formModifier) {
$user = $event->getData();
$formModifier($event->getForm(), $user->getFamilyStatus());
}
);
$builder->get('familyStatus')->addEventListener(
FormEvents::POST_SUBMIT,
function (FormEvent $event) use ($formModifier) {
$status = $event->getForm()->getData();
$formModifier($event->getForm()->getParent(), $status);
}
);
}
我的家庭信息类型:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('partnerName', TextType::class, [
'label' => 'Nom du partenaire',
'label_attr' => [
'class' => 'fg-label'
],
'attr' => [
'class' => 'sc-gqjmRU fQXahQ'
],
'required' => true
])
->add('weddingProof', FileType::class, [
'label' => 'Acte de mariage',
'label_attr' => [
'class' => 'Upload-label'
],
'attr' => [
'class' => 'Upload-input',
'maxsize' =>'4M',
'accept' =>'image/*'
],
'required' => false,
'mapped' => false
]);
}
我的用户控制器:
/**
* @Route("/user", name="add_user", methods={"GET", "POST"})
* @param Request $request
*/
public function addUser(Request $request) {
$response = [];
$user = new User();
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
if ($user->getFamilyStatus() === 'M') {
var_dump("ok");
$document = $form->get('familyInfo')->get('weddingProof')->getData();
$partnerName = $form->get('familyInfo')->get('partnerName')->getData();
var_dump($document); // NULL
var_dump($partnerName); // OK the value is displayed
die;
}
}
return $this->render("user/registration.html.twig", ['form' => $form->createView()]);
}
它适用于TextType
field 但不适用于FileType
. 我的表格有什么问题。
解决方案
问题在于文件类型的 mapped => false 选项。该表单未在您的实体属性中设置上传的文件对象,因为它未映射。
推荐阅读
- node.js - eslint-plugin-nuxt@npm:2.0.0 不提供 eslint@^6.2.0 || ^7.0.0 || ^8.0.0-0 由 eslint-plugin-vue@npm:7.17.0 请求
- javascript - 在常绿任务之外排空微任务队列
- python - 附加到正在运行的 python 进程时,vscode 出现错误“等待调试服务器连接超时”
- android - 如何从 youtubeAndroidPlayerAPI 在 youtubeplayerview 中播放 youtube 私人视频?
- discord - Discord:从(非管理员权限)服务器中的一个频道读取消息,并将其发布到另一个(使用管理员权限)
- influxdb - InfluxDB 2.0 - 如何使用 Flux 将 2 个单独的存储桶流合并和求和
- javascript - Javascript 在 HTML 中更改了我的 Div 的格式
- docker - docker-proxy 保持端口开放,无法启动服务
- swift - 在控制 NSTableView 的同时更新 NSTextField
- c# - 包含多个具有相同名称 Newtonsoft.Json.dll 或当前平台的预编译程序集