2014-07-15 15 views
5

Tôi đang cố gắng tìm một tùy chọn làm việc có thể tái sử dụng nhiều nhất để có thể dịch từ một FormType.Tiêm dịch vụ dịch sang FormType

lựa chọn đầu tiên của tôi là để tuyên bố một dịch vụ cụ thể cho từng FormType theo cách này:

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

cho lỗi này

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

Tôi muốn biết nóng để giải quyết nó bằng cách thay đổi mã hoặc thậm chí tìm kiếm tốt hơn một lựa chọn tốt hơn cho phép tôi để tiêm dịch vụ phiên dịch cho bất kỳ FormType mà không cần phải khai báo mỗi Dịch vụ FormType riêng lẻ.

Trả lời

1

Mặc dù tôi muốn biết làm thế nào để giải quyết vấn đề tiêm, cuối cùng tôi đã tìm được giải pháp tốt hơn, chỉ đơn giản là ghi đè lỗi biểu mẫu bằng Twig bao gồm khối này trên chủ đề cành tùy chỉnh của tôi, bao gồm cả bộ lọc chuyển đổi.

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

bạn EnqurityType phải trả lại toàn bộ hình thức để bên buildForm Bạn nên tạo toàn bộ hình thức

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

Và trong constructor Bạn nên gõ gợi ý cho TranslatorInterface thiết kế gọi của mình bằng hợp đồng

+0

BuildForm() tất nhiên có $ builder-> add lines, chỉ bị bỏ qua trên mã vì không có liên quan đến vấn đề này. Vậy làm thế nào các services.yml và sử dụng & _construct từ enquiryType nên được? –

+0

Nếu Bạn có lĩnh vực được xác định trong 'formBuilder' xóa 'create' và xây dựng nên nhìn như' public function __construct (TranslatorInterface $ dịch = null) ' –

+0

Done như đề xuất nhưng sau đó nhận được lỗi này: Gọi phương pháp xác định Acme \ DemoBundle \ Mẫu \ EnquiryType :: createView(). Ở phía bên kia tôi nhận được một giá trị null cho $ translator, tôi có nên thay đổi services.yml không? –

0

Để làm cho nó hoạt động đúng với Dependency Injection bạn cần gắn thẻ nó như là một form.type:

tags: 
    - { name: form.type } 

cũng không nhận được nó từ thùng chứa giống như một dịch vụ thông thường, nhưng sử dụng trình trợ giúp bộ điều khiển vì nó là một dạng form thông thường:

$this->createForm(...) 

Tham gia ook vào: http://symfony.com/doc/2.8/form/form_dependencies.html

Các vấn đề liên quan