Symfony4中表单非映射字段setData赋值失效问题求助
解决Symfony4表单非映射字段赋值失败的问题
先说明下,这可不是重复提问哈——别人的问题是访问表单字段,我是要给非映射字段赋值,之前搜的相关内容根本解决不了我的问题。
我在Symfony4环境开发时,想在表单渲染前给一个叫roleGroup的非映射字段预设值,试了好几种方法都没效果,先给大家看看我的表单字段配置:
->add('roleGroup', EntityType::class, array( 'label' => "Grupo que recibira los correos de validación como Administración", 'required' => false, "mapped" => false, 'placeholder' => 'Elige el Grupo', 'class' => RoleGroup::class, 'label_attr' => array( 'class' => 'control-label' ), 'attr' => array( 'class' => 'form-control select', ) ))
我在控制器里试了下面两种赋值方式,结果都失败了:
第一种写法:
$form["roleGroup"]->setData(21);
第二种写法:
$form->get("roleGroup")->setData(21); return $this->render('configuration/index.html.twig', [ 'id' => $id, 'title' => "General", 'partial' => "general.html.twig", 'form' => $form->createView(), ]);
后来才搞明白问题出在哪!因为EntityType字段绑定的是实体对象,不是单纯的ID数值!直接传21这种ID数字根本不生效,得先从数据库里取出对应的RoleGroup实体,再把实体对象传给setData()才行。
给大家分享下正确的解决步骤:
1. 注入RoleGroup的仓库类到控制器
先通过构造函数注入仓库,这样才能从数据库查实体:
use App\Repository\RoleGroupRepository; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; class ConfigurationController extends AbstractController { private $roleGroupRepo; public function __construct(RoleGroupRepository $roleGroupRepo) { $this->roleGroupRepo = $roleGroupRepo; } // 你的表单相关action方法 }
2. 获取实体并赋值
在你的action里,先找到对应ID的实体,再给字段赋值:
// 查找ID为21的RoleGroup实体 $targetRoleGroup = $this->roleGroupRepo->find(21); // 确保实体存在再赋值 if ($targetRoleGroup) { $form->get('roleGroup')->setData($targetRoleGroup); } return $this->render('configuration/index.html.twig', [ 'id' => $id, 'title' => "General", 'partial' => "general.html.twig", 'form' => $form->createView(), ]);
如果你的业务需要更复杂的查找逻辑,也可以用findOneBy()之类的方法,只要能拿到对应的RoleGroup实体对象就可以。另外要注意,如果ID对应的实体不存在,setData()会传入null,字段就会回到预设的占位符状态,这点可以根据业务需求做判断处理。
内容的提问来源于stack exchange,提问作者jcarlosweb
相关产品推荐
相关产品推荐

