2016-05-06 10 views
0

Ich möchte mit meinem DataTransformer Base64 Zeichenfolgen in FileSystem Bilder konvertieren.Symfony: Verwenden Sie DataTransformer in FormType über Dependency-Injektion

mein Code:

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') 

    ; 
} 

Mein aktuelles Problem ist, dass die base64DataTransformer Variable in slidetype null ist.

Können Sie mir sagen, warum ist das null?

Vielleicht kann ich das ContainerAwareInterface in meinem SlideType verwenden. Aber ich möchte meine Abhängigkeiten nicht manuell in meine DataTransformer-Klasse einfügen.

+0

Es ist richtig scheint, Sobald Sie herausfinden, was falsch ist, sollten Sie Befestigen Sie den Modelltransformator außerhalb der Builder-Add-Chain. '$ Builder-> get ('Hintergrund') -> addModelTransformer ($ this-> base64DataTransformer);' – Akash

+0

Okay, ich habe versucht, das Formular mit dem FormBuilder in meinem FOSRestController zu erstellen. Derzeit verwende ich die ApiDoc-Annotationen, um eine Sandbox zum Testen meiner REST-Services zu generieren. Ich habe Probleme mit dem Eingabewert: input = "Lion \ Visionomie \ MediaBundle \ Form \ SlideType" Jetzt weiß ich nicht, welche Parameter ich an meinen Controller weitergeben soll. Außerdem denke ich, es ist ein Workaround. Denkst du, ich sollte mein Formular mit einer benutzerdefinierten Klasse umhüllen oder es der Symfony Dev-Gruppe melden? –

+0

Ich wusste nicht, dass Sie FOSRestBundle verwenden, wie instanziieren Sie das Formular? – Akash

Antwort

0

Wenn Sie Ihr Formular im DIC mit Symfony < 2.8 registrieren möchten, sollten Sie den Parameter alias: <result of getName()> zum Tag form.type des Typs hinzufügen. In Ihrem Fall, wenn SlideType::getName() kehrt slide, stellen Sie den Tag { name: form.type, alias: slide } und sicherstellen, dass die Form, indem man den Namen instanziert wird, nicht die Art Beispiel:

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

// bad 
$form = $this->createForm(new SlideType(), ...);