2014-07-15 36 views
5

Bir FormType'dan çeviri yapabilmek için en çok yeniden kullanılabilir çalışma seçeneğini bulmaya çalışıyorum.Translator hizmetinin FormType'a enjekte edilmesi

Benim ilk seçenek her FormType için özel olarak bu şekilde bir hizmet ilan etmektir:

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

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

Ben kodu değiştirmeden veya daha iyi her ilan etmek gerek kalmadan bana herhangi FormType için çevirmen hizmeti enjekte sağlar daha iyi bir seçenek bularak çözmek için sıcak bilmek istiyorum bu hatayı verir FormType hizmeti ayrı ayrı. Sen bütün form oluşturmak gerekir buildForm kadar içi

cevap

1

tarafından TranslatorInterface onun adı verilen tasarım için ipucu yazın gerektiğini Enjeksiyon sorunu nasıl çözülür, nihayet daha iyi bir çözüm bulmayı başardım, sadece Twig tarafından form filtreleme de dahil olmak üzere özel twig temamda bu bloğu içeren form hatası oluşturma işlemini geçersiz kıldım. Ayrıca

tags: 
    - { name: form.type } 

kaptan alamadım:

1

Sizin EnqurityType tüm formu dönmelidir

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

Ve bilmek isteriz, ancak yapıcı Sen sözleşme

+0

Elbette buildForm(), bu sorunla ilgili olmadığı için kodda atlanan $ builder-> add lines'a sahiptir. Peki services.yml ve enquiryType'ın kullanımı ve _construct nasıl olmalıdır? –

+0

"formBuilder" delete "create" öğesinde tanımlanmış alanlarınız varsa ve kurucu 'public function __construct (TranslatorInterface $ translator = null)' gibi görünmelidir –

+0

Önerilen şekilde yapıldı, ancak hata oluştu: Acme \ DemoBundle \ Form undefined \ EnquiryType :: createView(). Diğer tarafta $ çevirmen için boş bir değer alıyorum, ben de services.yml değiştirmeliyim? –

0

o Dependency Injection ile düzgün çalışmasını sağlamak için

{% 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 %} 

{%% endblock form_errors} Bir form.type olarak etiketlemek için ihtiyaç Her zamanki gibi bir servis gibi, ama normal bir formda olduğu gibi denetleyici yardımcısını kullanınType:

$this->createForm(...) 

al al içine düştü: http://symfony.com/doc/2.8/form/form_dependencies.html

İlgili konular