2016-08-18 21 views
4

私はsymfony 3で私のアプリケーションのファイルアップロード機能を実装しようとしています。 私は、ファイルentiryとの関係を持っている製品entiryを持っています。製品の パート:フォーム上のSymfony 3 FileUpload

/** 
* @ORM\OneToMany(targetEntity="AppBundle\Entity\File", mappedBy="product") 
* @ORM\OrderBy({"weight" = "DESC"}) 
*/ 
protected $files; 

とフィールド:

 ->add('files', FileType::class, array('multiple'=> true, 'data_class'=> 'AppBundle\Entity\File')); 

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

あなたが見ることができるように、私はdata_class設定しています。

とコントローラにIは、ハンドル形

public function addAction(Request $request) 
{ 
    $em = $this->getDoctrine()->getManager(); 
    $product = new Product(); 
    $product->setAddedBy($this->getUser()); 
    $form = $this->createForm(ProductType::class, null); 
    $form->handleRequest($request); 
    ... 

しようとしていると私はエラーを持っている:

Expected argument of type "AppBundle\Entity\File", "Symfony\Component\HttpFoundation\File\UploadedFile" given

私はエラーなしオブジェクト、単にアレイを持っていないdata_classマッピングを削除した場合。 このエラーを解決する方法、UploadedFileをファイル(Entiry)に変換する方法私はTransformerを作成しようとしていますが、ProductEntiryクラスを取得しています。ファイルがないため、結果を処理できません。

答えて

7

私がこの点に着手する前に、1つだけ提案します。行では:それはなく、自動的に新しいものを作るのデータで満たされますよう

$form = $this->createForm(ProductType::class, null); 

私は$product変数を提供します。 、検証が成功した後、次に

public function addFile(AppBundle\Entity\File $file) { ... } 

フォームの試行を:だから、それは次のように変更します。あなたは、おそらくのようなあなたのProductクラスでセッターを持っているので

$form = $this->createForm(ProductType::class, $product); 

[OK]を、今、問題は、発生しますsymfonyのUploadedFileクラスインスタンスを含むフォームのデータでProductクラスのインスタンスを埋めます。あなたがそれを理解していただければ幸いです

ここでは、少なくとも2つの解決策があります。

ファイルフィールドには、"mapped" => falseオプションを設定できます。それはフォームが基礎となるオブジェクト(Productインスタンス)にその値を入れようとするのを止めるでしょう。

これを実行すると、ファイルのアップロードを処理する独自の値を処理することができます。AppBundle/Entity/Fileインスタンスを作成し、セッターを介して$product変数に設定します。

解決策だが、他のフォームで同じことをしたい場合は、コードを必要なすべてのコントローラにコピーする必要があります。だから、一度だけの使用の方が簡単です。

UploadedFileFileオブジェクトに変換するのは、Data Transformerです。これは話すのがより長いトピックであり、正確な解決策は、達成したいデータフローに依存します。したがって、これを正しく実行したい場合は、まずSymfonyのドキュメントのData Transformersを読んでください。

私はあなたが正しいことをしたら、後であなた自身に感謝することを約束します。私はデータトランスフォーマーを含むSymfony Form Componentの理解に時間を費やし、同様の問題を解決しました。今それは支払う。以前にアップロードしたファイルを編集フォームで削除しても、イメージアップロードフォームを再利用できるようになりました。

P.S. それは"エンティティ"ではなく、"entiry"ではありません。 「entiry」を2回書いたので、私はちょうどFYIを言っています。

+0

回答ありがとうございます。それは作品です –