为什么我似乎无法将变量从控制器传递给symfony 4中的表单?

Pie*_*rre 5 symfony

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

在configureOptions中将变量定义为setDefaults,然后setRequired从createForm(ThingType :: class,$ thing,array('my_option'=> $ myOption))中的控制器传递一个array()类型

从控制器:

$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',

       ]);


   }
Run Code Online (Sandbox Code Playgroud)

因此,只需尝试将pieceId传递给其自己的querybuilder的表单,以便它使用我需要的内容填充select。

相反,错误“选项“ 0”(或“ pieceId”)不存在。定义的选项是等,等等。

Pie*_*rre 1

所以我最终把它理顺了。两件事情 :

  • 我忘记提及的是,此表单类型是父表单的嵌入子项:因此我必须以相同的方式将变量设置为默认选项,但在上游,然后将其作为 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,
        ]);
    }



Run Code Online (Sandbox Code Playgroud)

从那里,变量被传递到子表单,而无需更改代码(错误仅在上游)。

儿童形式:

    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']);

    }
}

Run Code Online (Sandbox Code Playgroud)
  • 一旦变量水合了子表单,从 query_builder 参数调用的存储库方法将使表单抛出格式错误(“给定的数组”之类的东西):原因是,因为这是存储库中的现有方法,称为通过其他控制器,它包含 ->getQuery() 和 ->getResult() 查询构建器子方法,其中破坏了表单。
    public function findByPieceAndReturnOrdered($pieceId)
    {
        return $this->createQueryBuilder('i')
            ->andWhere('i.Piece = :val')
            ->setParameter('val', $pieceId)
            ->orderBy('i.ordering', 'ASC')
            ->getQuery()
            ->getResult()
        ;
    }
Run Code Online (Sandbox Code Playgroud)

所以我最终像一个非常懒的人一样在表单类型中编写了一个专用的查询函数,这使得我的表单最终得以呈现。

                'query_builder' => function (ImageRepository $er) use ($test){
                    return $er->createQueryBuilder('u')
                        ->andWhere('u.Piece = :val')
                        ->setParameter('val', $test)
                        ->orderBy('u.ordering', 'ASC')

;

Run Code Online (Sandbox Code Playgroud)

只需删除 getQuery() 和 getResult() 即可。儿童形式喜欢在没有辅助轮的情况下进行查询。

谢谢