2014-07-15 11 views
5

Sto cercando di trovare l'opzione di lavoro più riutilizzabile per essere in grado di tradurre da un FormType.Injectioning Translator service to FormType

La mia prima opzione è quella di dichiarare un servizio specifico per ogni FormType questo modo:

services.yml

form.enquiry: 
    class: Acme\DemoBundle\Form\EnquiryType 
    arguments: [@translator] 

EnquiryType.php

use Symfony\Component\Translation\Translator; 
class EnquiryType extends AbstractType { 

    public $translator; 
    public function __construct(Translator $translator=null) 
    { 
     $this->translator = $translator; 
    } 

public function buildForm(FormBuilderInterface $builder, array $options) { 
    $tr= $this->translator; 
    $msg=$tr->trans('default_error'); 
    $builder->add ... 

MyController.php

$form = $this->container->get('form.enquiry')->create(); 
return $this->render('AcmeDemoBundle:Home:index.html.twig', array(
    'form' => $form->createView() 
)); 

dà questo errore

FatalErrorException: Error: Call to undefined method Acme\DemoBundle\Form\EnquiryType::create()

mi piacerebbe sapere a caldo di risolverlo modificando il codice o meglio ancora trovare una soluzione migliore che mi permette di iniettare il servizio di traduttore per qualsiasi FormType senza bisogno di dichiarare ogni Servizio FormType individualmente.

risposta

1

Anche se mi piacerebbe sapere come risolvere il problema dell'iniezione, sono finalmente riuscito a trovare una soluzione migliore, semplicemente ignorando il rendering dell'errore di forma di Twig, incluso questo blocco sul tema del ramoscello personalizzato, incluso il filtro trans.

{% block form_errors %} 
{% spaceless %} 
    {% if errors|length > 0 %} 
     {# 
    <ul> 
     {% for error in errors %} 
      <li>{{ error.message }}</li> 
     {% endfor %} 
    </ul>#} 
     {% for error in errors %} 
      <div class="field_error">{{ error.message |trans}}</div> 
     {% endfor %} 
    {% endif %} 
{% endspaceless %} 

{% form_errors endblock%}

1

tuo EnqurityType deve tornare forma intera così all'interno buildForm Si dovrebbe creare la forma intera

$builder 
->setAction('action') 
->setMethod('POST') 
->add('field', 'field_type') 

E nel costruttore Si dovrebbe digitare suggerimento per TranslatorInterface la sua chiamata di progettazione per contratto

+0

Il buildForm() ha ovviamente $ builder-> aggiungi righe, semplicemente omesse nel codice in quanto non pertinenti per questo problema. Quindi, come dovrebbero essere i servizi.yml e l'uso di & _construct dall'enquiryType? –

+0

Se hai campi definiti in 'formBuilder' cancella' create' e constructor dovrebbe apparire come 'public function __construct (TranslatorInterface $ translator = null)' –

+0

Fatto come suggerito ma poi ottenere questo errore: Call to undefined method Acme \ DemoBundle \ Form \ EnquiryType :: createView(). Dall'altro lato sto ottenendo un valore nullo per $ translator, dovrei cambiare anche services.yml? –

0

per farlo funzionare correttamente con Dependency Injection è necessario etichettare come un form.type:

tags: 
    - { name: form.type } 

anche non lo ottengono dal contenitore come un normale servizio, ma usa l'helper del controller come era una forma normaleTipo:

$this->createForm(...) 

immettersi in: http://symfony.com/doc/2.8/form/form_dependencies.html