首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何解决Symfony (嵌入式)窗体中的数据类型冲突?

如何解决Symfony (嵌入式)窗体中的数据类型冲突?
EN

Stack Overflow用户
提问于 2014-08-14 12:12:07
回答 1查看 1.3K关注 0票数 0

我正在试图建立一个表格来回答一个小的调查。

在用我的表单加载页面时,我会得到以下错误:

表单的视图数据应该是标量、数组或\ArrayAccess实例的类型,但它是类VS\myproject\UserBundle\Entity\User的实例。可以通过将"data_class“选项设置为" VS\myproject\UserBundle\Entity\User”,或者添加视图转换器,将VS\myproject\UserBundle\Entity\User类的实例转换为标量、数组或\ArrayAccess实例,从而避免此错误。

--我一开始看不出我将在哪里使用用户实体,并且很难从这个错误消息中得到一些东西。有人能帮忙吗?

更多信息

堆栈跟踪

代码语言:javascript
运行
复制
in <myprojectdirectorypath>\vendor\symfony\symfony\src\Symfony\Component\Form\Form.php at line 353   + 

at Form ->setData (object(User)) 
in <myprojectdirectorypath>\vendor\symfony\symfony\src\Symfony\Component\Form\Extension\Core\DataMapper\PropertyPathMapper.php at line 57   + 

at PropertyPathMapper ->mapDataToForms (object(CustomerSurvey), object(RecursiveIteratorIterator)) 
in <myprojectdirectorypath>\vendor\symfony\symfony\src\Symfony\Component\Form\Form.php at line 385   + 

at Form ->setData (object(CustomerSurvey)) 
in <myprojectdirectorypath>\vendor\symfony\symfony\src\Symfony\Component\Form\Form.php at line 477   + 

at Form ->initialize () 
in <myprojectdirectorypath>\vendor\symfony\symfony\src\Symfony\Component\Form\FormBuilder.php at line 230   + 

at FormBuilder ->getForm () 
in <myprojectdirectorypath>\vendor\symfony\symfony\src\Symfony\Component\Form\FormFactory.php at line 39   + 

at FormFactory ->create (object(CustomerSurveyType), object(CustomerSurvey), array()) 
in <myprojectdirectorypath>\vendor\symfony\symfony\src\Symfony\Bundle\FrameworkBundle\Controller\Controller.php at line 181  + 

at Controller ->createForm (object(CustomerSurveyType), object(CustomerSurvey)) 
in <myprojectdirectorypath>\src\VS\Myapp\MobileBundle\Controller\SurveyController.php at line 33   + 

at SurveyController ->takeSurveyAction ('1') 

at call_user_func_array (array(object(SurveyController), 'takeSurveyAction'), array('1')) 
in <myprojectdirectorypath>\app\bootstrap.php.cache at line 2969   + 

at HttpKernel ->handleRaw (object(Request), '1') 
in <myprojectdirectorypath>\app\bootstrap.php.cache at line 2931   + 

at HttpKernel ->handle (object(Request), '1', true) 
in <myprojectdirectorypath>\app\bootstrap.php.cache at line 3080   + 

at ContainerAwareHttpKernel ->handle (object(Request), '1', true) 
in <myprojectdirectorypath>\app\bootstrap.php.cache at line 2330   + 

at Kernel ->handle (object(Request)) 
in <myprojectdirectorypath>\web\app_dev.php at line 28   + 

数据模型

([]中实体)

调查具有一个或多个SurveyItem,可以作为CustomerSurvey分配给一个或多个用户。

在构建表单时,每个SurveyItem都会为当前CustomerSurvey创建一个SurveyItemResult。

控制器

构建调查响应表单(基于实体CustomerSurvey并嵌入所有相关的SurveyItemResult)的控制器如下所示:

代码语言:javascript
运行
复制
<?php

namespace VS\Myapp\MobileBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use VS\Myapp\WebBundle\Entity\SurveyItemResult;
use VS\Myapp\MobileBundle\Form\Type\CustomerSurveyType;

class SurveyController extends Controller
{
    public function indexAction()
    {
        $customerSurveys = $this->getUser()->getCustomerSurveys();

        return $this->render('VSMyappMobileBundle:Survey:index.html.twig', array('customerSurveys' => $customerSurveys));
    }

    public function takeSurveyAction($customerSurveyId)
    {

        $customerSurvey = $this->getDoctrine()->getRepository('VSMyappWebBundle:CustomerSurvey')->find($customerSurveyId);

        foreach($customerSurvey->getSurvey()->getItems() as $surveyItem)
        {

            $csr = new SurveyItemResult();
            $csr->setSurveyItem($surveyItem);

            $customerSurvey->addResult($csr);
        }

        $form = $this->createForm(new CustomerSurveyType(), $customerSurvey);

        return $this->render('VSMyappMobileBundle:Survey:takeSurvey.html.twig', array( 'form' => $form->createView()));

    }

}

表格类型

这是我为CustomerSurvey构建的表单类型

代码语言:javascript
运行
复制
<?php
namespace VS\Myapp\MobileBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class CustomerSurveyType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder->add('results', 'collection', array('type' => new SurveyItemResultType()));

        $builder->add('customer', 'hidden');
        $builder->add('survey', 'hidden');

        $builder->add('save', 'submit', array('label' => 'Submit your answer'));
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'VS\Myapp\WebBundle\Entity\CustomerSurvey',
        ));
    }

    public function getName()
    {
        return 'customerSurvey';
    }
}

这是应该嵌入的SurveyItemResult的表单类型:

代码语言:javascript
运行
复制
<?php
namespace VS\Myapp\MobileBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class SurveyItemResultType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder->add('textResult', 'text');

    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'VS\Myapp\WebBundle\Entity\SurveyItemResult',
        ));
    }

    public function getName()
    {
        return 'surveyItemResult';
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-18 09:04:03

当您试图将customer对象和survey对象映射到标量值(作为整数)时,就会发生这种情况:

代码语言:javascript
运行
复制
    $builder->add('customer', 'hidden');
    $builder->add('survey', 'hidden');

若要避免此问题,请将此更改为:

代码语言:javascript
运行
复制
    $user = $builder->create('customer', 'hidden');
    $user->addViewTransformer(new IdToObjectTransformer($entityManager, 'FQCN of User model'));

    $survey = $builder->create('survey', 'hidden');
    $survey->addViewTransformer(new IdToObjectTransformer($entityManager, 'FQCN of Survey model'));

    $builder->add($user);
    $builder->add($survey);

IdToObjectTransformer类https://gist.github.com/korotovsky/eeedb6e5d8f6bd9dca38示例

有关数据转换器的更多信息,请阅读:transformers.html#model-and-view-transformers

在Symfony2中,这是非常强大的东西。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25307775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档