2016-08-02 79 views
0

我有这个奇怪的问题,这里是我的自定义ThingType类的示例用法。Symfony自定义窗体奇怪的属性访问错误

->add('photos', 'namespace\Form\Type\ThingType', [ 
    'required' => false, 
]) 

如果字段名称是photos一切正常,但如果我改变我的实体领域,让我们说photosi,运行产生的实体,并更改表单字段名,这个错误被抛出:

既不是属性“photosi”也不是方法 “addPhotosus()”/“removePhotosus()”,“setPhotosi()”,“photosi()”, “__set()”或“__call()”存在并在类别 “AppBundle \ Entity \ Product”中公开访问。

我想问题来自Symfony试图为我的实体生成getter方法名称。为什么这个addPhotosus方法名称生成?我该如何解决这个问题?

编辑:

我使用的变压器模型显示数据时给用户。

$builder->addModelTransformer(new CallbackTransformer(
     function ($imagesAsText) { 
      if (!$imagesAsText) { 
       return null; 
      } 

      $newImages = []; 
      foreach($imagesAsText as $img) { 
       $newImages[] = $img->getID(); 
      } 

      return implode(',', $newImages); 
     }, 
     function ($textAsImages) use ($repo) { 
      $images = []; 
      foreach(explode(',', $textAsImages) as $imgID) { 
       $img = $repo->findOneById($imgID); 

       if ($img) { 
        $images[] = $img; 
       } 
      } 

      return $images; 
     } 
    )); 

实际字段是TextType :: class,其中包含实体ID,例如1,10,32,51。模型转换器将这些数据转换为实体。将'data_class'设置为我的表单类型似乎不相关,因为实际的表单类型是实体的一部分。我的意思是我有Product实体和Photo实体,photosphoto实体的数组。所以在我的ThingType中,我应该使用什么data_classphotoproduct

由于

回答

1

为窗体add方法的拳头参数,应是这样的形式的data_class的映射的属性之一,通常的形式内选择作为

public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\Product' 
     )); 
} 

即ISN” t与表单名称相关。因此,您正在尝试访问您的Product类中的“photosi”属性。

希望这对你有所帮助。

+1

如果您希望此子不是mappe,则可以添加'mapped'=> false。 – Alsatian

+0

我使用TextType :: class来保存由modelTransformer转换的实体数组,当我尝试设置'data_class'时出现此错误'表单的视图数据应该是类AppBundle \ Entity \ Product的一个实例,但是(n)字符串' – nacholibre

+1

@nacholibre也许你应该用一些代码来更新你的问题,或者做一个新的问题,因为它跟这个线程问题没有任何关系。 – abdiel