2016-05-06 5 views
0

私のDataTransformerを使用して、base64文字列をfileSystemイメージに変換したいと考えています。symfony:Dependency Injectionを使用してformTypeのDataTransformerを使用する

私のコード:

services: 
lion_visionomie_media_bundle_base64_data_transformer: 
    class: Lion\Visionomie\MediaBundle\Transformer\Base64DataTransformer 
    arguments: ['@sonata.media.generator.default', '@sonata.media.manager.media', '@sonata.media.pool', '@doctrine.orm.entity_manager'] 

lion_visionomie_media_bundle_slide_type: 
    class: Lion\Visionomie\MediaBundle\Form\SlideType 
    arguments: ['@lion_visionomie_media_bundle_base64_data_transformer'] 
    tags: 
     - {name: form.type} 

class Base64DataTransformer implements DataTransformerInterface 
{ 
/** 
* @var GeneratorInterface 
*/ 
private $pathGenerator; 

/** 
* @var MediaManager 
*/ 
private $mediaManager; 

/** 
* @var Pool 
*/ 
private $pool; 

/** 
* @var EntityManagerInterface 
*/ 
private $entityManager; 

public function __construct(GeneratorInterface $generator, MediaManager $mediaManager, Pool $pool, EntityManagerInterface $entityManager) 
{ 
    $this->pathGenerator = $generator; 
    $this->mediaManager = $mediaManager; 
    $this->pool = $pool; 
    $this->entityManager = $entityManager; 
} 

/** 
* @param mixed $value 
* @return mixed 
*/ 
public function transform($value) 
{ 
    // [...] 
    return $media; 
} 

/** 
* @param mixed $value 
* @return mixed 
*/ 
public function reverseTransform($value) 
{ 
    /** @var Media $media */ 
    $media = $value; 

    return base64_encode(file_get_contents($media->getPreviousProviderReference())); 
} 
} 

class SlideType extends AbstractType 
{ 
/** 
* @var Base64DataTransformer 
*/ 
private $base64DataTransformer; 

public function __construct(Base64DataTransformer $base64DataTransformer) 
{ 
    dump($base64DataTransformer); 
    die; 
    $this->base64DataTransformer = $base64DataTransformer; 
} 

/** 
* @param FormBuilderInterface $builder 
* @param array $options 
*/ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('name') 
     ->add('active') 
     ->add('background') 
      ->addModelTransformer($this->base64DataTransformer) 
     ->add('thumbnail') 

    ; 
} 

私の現在の問題はSlideTypeでbase64DataTransformer変数がnullであること、です。

なぜこのヌルですか?

おそらく私はSlideTypeでContainerAwareInterfaceを使用できます。しかし、私はDataTransformerクラスに自分の依存関係を手動で入れたくありません。

+0

、一度はいただきました!間違っているあなたがすべき見つけますビルダー追加チェーンの外側にモデルトランスを取り付けます。 ($ this-> base64DataTransformer); ' – Akash

+0

さて、FOSRestControllerにFormBuilderを使ってFormを作成しようとしました。現在、ApiDoc Annotationsを使用してREST-Servicesをテストするサンドボックスを生成しています。私は入力値に問題があります:input = "Lion \ Visionomie \ MediaBundle \ Form \ SlideType" 今、どのパラメータを私のコントローラに渡すべきかわかりません。さらに、私はそれが回避策だと思います。フォームをカスタムクラスでラップするか、それをsymfony開発者グループに報告する必要があると思いますか? –

+0

FOSRestBundleを使用していることに気づいていませんでしたが、フォームをどのようにインスタンス化していますか? – Akash

答えて

0

DICのフォームをSymfony < 2.8に登録する場合は、alias: <result of getName()>パラメータをタイプのform.typeタグに追加する必要があります。あなたの場合は、SlideType::getName()戻りslideは、{ name: form.type, alias: slide }にタグを設定し、名前を渡すことで、フォームがインスタンス化されていることを確認した場合、いないタイプのインスタンスを:それは正しいようだ

// good 
$form = $this->createForm('slide', ...); 

// bad 
$form = $this->createForm(new SlideType(), ...); 
関連する問題