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

标签 symfony

所以我试图在一个 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/

    相关文章:

    php - 为什么 “Undefined offset”在一台机器上引发异常,而在另一台机器上显示通知?

    php - Symfony 2 多项选择同一张表上的计数?

    symfony - 如何从 Symfony 中的编译器传递注入(inject)共享服务

    symfony - 如何为现有的 Symfony+Doctrine 应用程序生成初始/基础迁移?

    symfony - 类表继承中的级联删除不会删除父行

    symfony - 无法在产品中找到模板

    php - 如何使用 symfony2 中其他 2 个表的主键创建一个表?

    Symfony 2 - 翻译不起作用 (xliff)

    Symfony 4 EasyAdmin 如何加密密码?

    php - 'Acme' 在 Symfony2 中代表什么?