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 gender1
và gender2
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 Gender1Type
và Gender2Type
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?
Đú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