2015-12-07 16 views
5

Giả sử tôi tạo các loại biểu mẫu tùy chỉnh dưới dạng dịch vụ, như được mô tả trong Symfony documentation. Nhưng tôi muốn 2 loại "giới tính" tùy chỉnh, với 2 thông số đầu vào khác nhau, mà tôi đã làm như thế này trong Symfony 2.7:Bản nâng cấp của Symfony 2.8/3.0: cách xử lý các loại biểu mẫu có thông số biến?

# app/config/config.yml 
parameters: 
    genders1: 
     m: Male 
     f: Female 
    genders2: # This makes no sense at all, but it is for the example purpose! 
     h: Horse 
     t: Turtle 

Và sau đó, tôi đã tuyên bố 2 dịch vụ như thế này:

<!-- src/AppBundle/Resources/config/services.xml --> 
<service id="app.form.type.gender1" class="AppBundle\Form\Type\GenderType"> 
    <argument>%genders1%</argument> 
    <tag name="form.type" alias="gender1" /> 
</service> 

<service id="app.form.type.gender2" class="AppBundle\Form\Type\GenderType"> 
    <argument>%genders2%</argument> 
    <tag name="form.type" alias="gender2" /> 
</service> 

như bạn thấy đấy, tôi đã sử dụng cùngGenderType lớp cho 2 loại hình thức tùy chỉnh (với gender1gender2 bí danh), mà tôi có thể sử dụng như thế này:

$builder 
    ->add('field1', 'gender1') 
    ->add('field2', 'gender2'); 

Điều này cho phép tôi thêm một số logic chung trong chỉ một lớp (GenderType) với các tham số đầu vào khác nhau (tôi có nhiều khả năng hơn 2 trong ví dụ này).

Nhưng như của Symfony 2.8, việc thêm trường bằng bí danh dịch vụ sẽ không còn được dùng nữa. Tên lớp phải được chuyển làm đối số thứ hai thay thế, như sau:

$builder->add('field1', GenderType::class) 

Vậy làm cách nào để tạo sự khác biệt giữa 2 dịch vụ của tôi (mỗi người không có cùng thông số đầu vào)?

Tạo Gender1TypeGender2Type mở rộng một lớp trừu tượng GenderType sẽ rất đau đớn vì tôi sẽ phải tạo nhiều lớp có nội dung trống.

Bạn có ý tưởng nào về cách triển khai mẫu của mình trong Symfony 2.8, giữ các dịch vụ với các tham số đầu vào khác nhau, nhưng không tạo nhiều lớp?

Trả lời

3

Vâng, sau khi tìm hiểu chủ đề này nhiều hơn một chút, someone already asked câu hỏi trực tiếp trong PR concerning this change trong Symfony 2.8.

Và câu trả lời là mô hình tôi đang làm là không thể nữa, vì vậy tôi thấy 2 giải pháp cho vấn đề của tôi:

  • Tạo như nhiều lớp học như tôi có dịch vụ với nhiều loại tùy chỉnh của tôi thay vì sử dụng tất cả cùng một lớp, và làm cho các lớp này mở rộng một lớp trừu tượng (trong ví dụ của tôi: tạo các lớp Gender1TypeGender2Type mở rộng lớp trừu tượng AbstractGenderType)
  • Chỉ giữ một lớp, nhưng thêm tùy chọn để chuyển các tham số cụ thể của mình.
+1

Đúng. Tôi chạy vào cùng một điều và đi đến cùng một kết luận. Có lợi thế trong việc sử dụng tên lớp nhưng trong trường hợp này tôi vẫn không thấy một lợi thế rõ ràng so với thiết kế ban đầu. Oh well. – Cerad

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