2016-08-02 4 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の問題だと思います。このaddPhotosusメソッド名が生成されるのはなぜですか?これをどうすれば解決できますか?

EDIT:

ユーザにデータを表示するとき、私はモデル変圧器を使用しています。

$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; 
     } 
    )); 

実際のフィールドは、たとえば1,10,32,51にとって内のエンティティIDを持つTextType ::クラスです。モデルトランスフォーマーは、このデータをエンティティに変換します。実際のフォームタイプはエンティティの一部であるため、 'data_class'を自分のフォームタイプに設定するのは無関係です。私はProductエンティティとPhotoエンティティを持っていることを意味します、photosphotoエンティティの配列です。だから私のThingTypeでは、data_class私は、photoまたはproductを使用する必要がありますか?

おかげ

答えて

1

フォームのAddメソッドの拳のパラメータは、通常

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

としてフォーム内、選択し、フォームのdata_classのマップされた属性のいずれかでなければなりません「にISNすなわちtはフォーム名に関連しています。したがって、Productクラス内の「photosi」属性にアクセスしようとしています。

ご希望の場合はこちらをご覧ください。

+1

また、この子をマップにしたくない場合は、 'mapped' => falseを追加できます。 – Alsatian

+0

私はTextType :: classを使用して、modelTransformerによって変換されたエンティティの配列を保持します。このエラーは 'data_class'を設定しようとしたときに表示されます 'フォームのビューデータはAppBundle \ Entity \ Productクラスのインスタンス、しかし、(n)文字列 ' – nacholibre

+1

@nacholibre多分あなたはこのスレッドの質問とは関係がないので、いくつかのコードであなたの質問を更新するか、新しいものを作るべきでしょう。 – abdiel