传递给 Symfony\Bridge\Doctrine\Form\ChoiceList\

我是 Symfony 的新手。我使用 DestinationFormType和DestinationController 来保存 Destination。JS 部分运行良好,但现在当我尝试保存实体时会抛出下一个异常:

传递给 Symfony\Bridge\Doctrine\Form\ChoiceList\IdReader::getIdValue() 的参数 1 必须是一个对象或 null,给定 int,在第 200 行的 \vendor\symfony\form\ChoiceList\ArrayChoiceList.php 中调用

奇怪的是,它似乎试图转换一个不需要转换的值(191)(堆栈调用顶部):

http://img1.sycdn.imooc.com/64a9203700016f3a10380724.jpg

对于国家/地区实体会引发错误。这是我的 DestinationFormType



慕莱坞森
浏览 124回答 3
3回答

潇潇雨雨

好吧,通过观看我的代码,答案并不明显,因为当你看到$countries = $countryRepository->findByRegionId($region->getId());你可能认为返回的是国家数组,但实际上它是 JS 的助手,只返回 id 和 name/** * @param int $regionId * @return array */public function findByRegionId(int $regionId){    return $this->createQueryBuilder('c')        ->select(['c.id', 'c.name'])        ->where('c.region = :id')        ->orderBy('c.name')        ->setParameter('id', $regionId)        ->getQuery()        ->execute();}所以以防万一其他人遇到这个问题: $choices 需要一个对象数组,而不是一个带有 id 和 name 的数组,所以我修改了我的 addCountryDropDown 方法,如下所示private function addCountryDropdown(FormInterface $form, ?Region $region, ?Country $country){    $countries = array();    if ($region) {        $countryRepository = $this->em->getRepository(Country::class);        $countries = $countryRepository->findBy([            'region' => $region->getId()        ]);    }    $form->add('country', EntityType::class, [        'required' => true,        'data' => $country,        'placeholder' => 'Select a Region first ...',        'class' => Country::class,        'choices' => $countries    ]);}

UYOU

使用 User 实体迁移到 Symfony 5.4 后,我遇到了同样的错误。现在 getRoles() 函数必须以字符串形式返回角色列表。就我而言,我有一个实体角色。我通过在 User 实体中添加 getRolesObjects() 解决了这个问题:public function getRolesObjects(): array{    if(is_array($this->roles)) {        return $this->roles;    } else if($this->roles && ($this->roles instanceof Collection)) {        return $this->roles->toArray();    } else {        return [];    }}并在 FormType 中添加自定义 getter:$builder            ->add('firstName', TextType::class)            ->add('lastName', TextType::class)            ->add('email',  TextType::class)            ->add('roles', EntityType::class, [                'class' => Role::class,                'multiple' => true,                'getter' => function (User $user, FormInterface $form): array {                    return $user->getRolesObjects();                }            ]);

慕工程0101907

事实证明,我试图将一个数组传递给一个ChoiceType未设置为接受多项选择的数组。我希望它可以挽救某人几分钟的生命!
打开App,查看更多内容
随时随地看视频慕课网APP