gpt4 book ai didi

symfony - 为什么我似乎无法将变量从 Controller 传递到 symfony 4 中的表单?

转载 作者:行者123 更新时间:2023-12-04 16:53:34 25 4
gpt4 key购买 nike

所以我试图在一个 Symfony 4.3 项目中将一个变量从我的 Controller 传递给一个表单......我试图设置选项解析器,传递数组......我仍然没有运气,'选项“0”没有存在....'

将 configureOptions 中的变量定义为 setDefaults 和 setRequired
在 createForm(ThingType::class, $thing, array ('my_option' => $myOption) 中从 Controller 传递一个数组 () 类型

从 Controller :
$form = $this->createForm(PieceEditType::class, $piece, ['pieceId'=> $piece->getId()]);
从形式方面:

    * @param FormBuilderInterface $builder
* @param array $options
*
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{

$pieceId = $options['pieceId'];

$builder
->add('full', FileType::class, [
'data_class' => null

])
->add('ordering', EntityType::class, [
'class' =>Image::class,
'choice_label' => 'ordering',
'query_builder' => function (ImageRepository $er){
return $er->findByPieceAndReturnOrdered($pieceId);

}
])


;
}

/**
* @param OptionsResolver $resolver
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Image::class,
'pieceId' => null,
));
$resolver->setRequired([
'pieceId',

]);


}

所以只是试图将一个pieceId传递给它自己的查询构建器的表单,这样它就会用我需要的东西来填充选择。

相反,错误 'The option "0"(or "pieceId") 不存在。定义的选项是等等'

最佳答案

所以我最终把它弄直了。两件事情 :

  • 我忘记提到的是,这种表单类型是父表单的嵌入子项:所以我必须以相同的方式将变量设置为默认选项,但在上游,然后将其作为 CollectionType 的参数数组 entry_options 的一个自定义索引传递.
  • class PieceEditType extends AbstractType
    {
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

    $pieceId = $options['pieceId'];

    $builder
    ->add('images', CollectionType::class, [
    'entry_type'=> ImagesEditType::class,

    'allow_add' =>true,
    'allow_delete' => true,
    'by_reference' =>false,
    'entry_options' => ['pieceId' => $pieceId,'label'=>false],

    ])
    ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
    $resolver->setDefaults([
    'data_class' => Piece::class,
    'pieceId'=> null,
    ]);
    }




    从那里,变量被传递给子窗体而代码没有改变(错误就在上游)。

    child 表格:
        public function buildForm(FormBuilderInterface $builder, array $options)
    {
    $test = $options['pieceId'];

    $builder
    ->add('ordering', EntityType::class, [
    'class' =>Image::class,
    'choice_label' => 'ordering',
    'query_builder' => function (ImageRepository $er) use ($test){
    return $er->findByPieceAndReturnOrdered($test);

    }
    ])
    }
    public function configureOptions(OptionsResolver $resolver)
    {

    $resolver->setDefaults(
    ['data_class' => Image::class,
    'pieceId' => null,
    ]
    ); $definedOptions = $resolver->getDefinedOptions();
    dump($definedOptions);
    $resolver->setDefined('pieceId');
    $resolver->setRequired(['pieceId']);

    }
    }

  • 一旦变量对子表单进行了补充,从 query_builder 参数调用的存储库方法将使表单抛出格式错误('array given' sorta thing):原因是,因为这是存储库中的现有方法,称为通过其他 Controller ,它包含 ->getQuery() 和 ->getResult() 查询构建器子方法,其中破坏了表单。
  •     public function findByPieceAndReturnOrdered($pieceId)
    {
    return $this->createQueryBuilder('i')
    ->andWhere('i.Piece = :val')
    ->setParameter('val', $pieceId)
    ->orderBy('i.ordering', 'ASC')
    ->getQuery()
    ->getResult()
    ;
    }

    所以我最终写了一个专门的查询函数,就在 formtype 中,就像一个非常懒惰的人,它让我的表单最终被渲染。
                    'query_builder' => function (ImageRepository $er) use ($test){
    return $er->createQueryBuilder('u')
    ->andWhere('u.Piece = :val')
    ->setParameter('val', $test)
    ->orderBy('u.ordering', 'ASC')

    ;


    只需删除 getQuery() 和 getResult() 即可。 child 形式喜欢他没有训练轮的查询。

    谢谢

    关于symfony - 为什么我似乎无法将变量从 Controller 传递到 symfony 4 中的表单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57166481/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com