2014-07-15 1 views
5

J'essaie de trouver l'option de travail la plus réutilisable pour pouvoir traduire à partir d'un FormType.Injection du service Translator vers FormType

Ma première option est de déclarer un service spécifiquement pour chaque FormType cette façon:

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() 
)); 

donne cette erreur

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

J'aimerais savoir à chaud pour le résoudre en changeant le code ou même trouver mieux une meilleure option qui me permet d'injecter le service de traducteur à tout FormType sans avoir besoin de déclarer chaque FormType service individuellement.

Répondre

1

Bien que je voudrais savoir comment résoudre le problème d'injection, j'ai finalement réussi à trouver une meilleure solution, en remplaçant simplement le rendu d'erreur de formulaire par Twig, y compris ce bloc sur mon thème twig personnalisé, y compris le filtre 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 %} 

{%}% ENDBLOC form_errors

1

Votre EnqurityType doit retourner le formulaire entier pour l'intérieur buildForm Vous devez créer toute forme

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

Et dans le constructeur Vous devez taper indice pour TranslatorInterface son design appelé par contrat

+0

Le buildForm() a bien sûr les lignes $ builder-> add, juste omis sur le code car il n'y avait pas de pertinence pour ce problème. Alors comment devrait être le service.yml et l'utilisation & _construit de l'enquiryType? –

+0

Si vous avez des champs définis dans 'formBuilder', supprimez' create' et le constructeur devrait ressembler à 'public function __construct (TranslatorInterface $ translator = null)' –

+0

Fait comme suggéré, mais obtenez cette erreur: Appel à la méthode indéfinie Acme \ DemoBundle \ Form \ EnquiryType :: createView(). De l'autre côté, je reçois une valeur nulle pour $ translator, devrais-je changer services.yml aussi? –

0

Pour le faire fonctionner correctement avec l'injection de dépendances vous devez le marquer comme form.type:

tags: 
    - { name: form.type } 

aussi ne reçoivent pas de récipient comme un service habituel, mais utiliser l'aide du contrôleur comme c'était une forme normaleType:

$this->createForm(...) 

ook dans: http://symfony.com/doc/2.8/form/form_dependencies.html