2017-11-15 10 views
2

のないエンティティでCollectionTypeは私がsymfony3フォームとCollectionTypeはクラスで苦労しています:symfonyの3 - フォーム - 教義

私はいくつかの複雑な形状を持つページがあります。

class ProductService 
{ 
    /** @var string */ 
    private $msg; 

    /** @var array*/ 
    private $products 
} 

とクラスProductServiceType:私は、任意のデータベース(検証フォームが外国RESTサービスに送信されます)

は、今度は、私が「ProductService」と呼ばれる私の要求のためのエンティティオブジェクトを持っているとしましょう使用しないでください

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('products', CollectionType::class, [ 
      'entry_type' => ProductType::class, 
     ]) 
     ->add('msg' [...]); 
} 

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults([ 
     'data_class' => ProductService::class, 
    ]); 
} 

この設定では、すべてが魅力的に機能し、すべての製品が自分のエンティティの製品配列に追加されます。 問題は、私は$の製品がSplObjectStorageオブジェクトになりたい、次のとおりです。

class ProductService 
{ 
    /** @var string */ 
    private $msg; 

    /** @var SplObjectStorage */ 
    private $products 
} 

私はこれにそれを設定し、その中に空のオブジェクトを添付する場合、symfonyはそれ以上のフォームをレンダリングすることはできません。これは、次のエラーがスローされます。 警告:教義とORMを使用しない場合SplObjectStorage :: offsetExists()は、誰が主体でCollectionTypeはをどのように扱うか、私に伝えることができ、パラメータ1だから

を指定されたオブジェクト、文字列であることを期待します? 配列を使用する唯一の可能性はありますか、またはこのケースのドキュメントがありますか、見つけられませんでしたか? (私はまだsymfonyがoffsetExistsをどのように呼び出すのか疑問に思っています、SplObjectStorageを処理するためにsometingが実装されている必要がありますか、間違っていませんか)

答えて

1

私はあなたのようにSplObjectStorageを処理するためにフォームコレクションが実装されていない期待するだろう。 symfonyリポジトリで問題を作成できます。

symfonyはProductServiceからこの方法をあなたのプロダクトを読み込むことで、フォームのコレクションを移入しようとしているときにエラーが発生している:それはArrayAccessのを実装する任意のストレージは、この方法を読み取ることと期待しているため

$products = $productService->getProducts(); 
$products->offsetExists(0); //here is the error. 

が、SplObjectStorageのためにこれはそうではありません。

フォーム要素の設定はproperty_pathlinkで、問題を回避するために利用できます。あなたは生産のアレイを使用して、フォームのコレクションを移入することができます

$builder 
     ->add('products', CollectionType::class, [ 
      'entry_type' => ProductType::class, 
      'property_path' => 'productsArray' 
     ]) 

class ProductService 
{ 

... 
public function getProductsArray() { 
    $prArray= []; 
    foreach ($this->products as $value) { 
     $prArray[] = $value; 
    } 
    return $prArray; 
} 

この方法:

私のソリューションは、あなたのコレクションを移入するには、この設定を使用して復帰配列を返すことです。

もう1つの解決策は、data transformerを使用することです。これが助けてくれるといいですか

+0

私の一日を過ごしました、あなたはボティスさんでした。本当に素晴らしい解決策です!私はそれを次の日に試して答えを出すでしょう。ありがとうございました – j0nnybrav0

+0

こんにちはJannes、私はちょうどあなたのソリューションを実装し、それは動作します。どうもありがとうございました! – j0nnybrav0

関連する問題