2013-04-02 31 views
9

Tôi càng sử dụng Symfony2 và đấu tranh với nó thì tôi càng đi đến kết luận rằng họ là một con thú đáng sợ lớn mà thậm chí không thực sự tồn tại.Thành phần biểu mẫu Symfony2 - vi phạm MVC và SRP?

Tôi đã xem bài viết này here và tôi thấy rằng tôi đồng ý với tác giả. Ngay cả khi bài viết dành cho Symfony 1.x tôi nghĩ nó vẫn giữ cho thành phần Form trong Symfony2. Nó thực sự có vẻ như thành phần biểu mẫu cố gắng giải quyết các vấn đề thuộc về mẫu, bộ điều khiển và mô hình, tất cả ở cùng một nơi. Điều này không vi phạm nghiêm trọng MVC và/hoặc SRP (nguyên tắc trách nhiệm duy nhất)?

Đây có thể là một câu hỏi khác nhau nhưng tôi cảm thấy nó là loại liên quan - Tôi cũng đã nhận thấy rằng rất nhiều các gói có sẵn cho symfony cố gắng để giải quyết các vấn đề tầm nhìn bên ngoài xem, ví dụ:

KnpMenuBundle - bạn tạo ra các menu ở phía máy chủ với giao diện oo (tại sao không ở trong lớp xem nơi chúng thuộc về?)

IvoryCKEditorBundle - chuyển văn bản thành ckeditor được thực hiện trong một dòng jquery trong tệp xem, vậy tại sao gói này tồn tại? Tôi thậm chí không muốn đếm số dòng trong đó.

Vì vậy, có vẻ như có những vi phạm này ở khắp mọi nơi trong cốt lõi của Symfony hoặc tôi không nhận được nó?

+2

Đó là công cụ của bên thứ 3. Trong khi có lỗi thiết kế trong Sf2, việc vi phạm SRP trong lõi thực tế của khung công tác là tối thiểu và chỉ áp dụng khi nó là giải pháp thực dụng. Những gì bạn đang xem không phải là cốt lõi. –

+0

Tôi có nghĩa là nó có vẻ giống như một nơi nào đó trong ý tưởng cốt lõi của Symfony có gì đó tồn tại khiến mọi người viết những bó điên rồ này. Nhưng không phải thành phần Form là thành phần cốt lõi của khung công tác chưa? – moljac024

+0

Có những thành phần như vậy trong Zend Framework, nhưng nó khá khủng khiếp. Tôi đã đi đến kết luận rằng việc tạo ra bất kỳ loại nhà xây dựng phù hợp với tất cả các hình thức là một việc thực hiện vô ích. –

Trả lời

20

Sự cố về xử lý biểu mẫu là vi phạm MVC theo định nghĩa. Đây là một vấn đề được gọi là "crosscutting" và đã được nghiên cứu bởi khoa học trong quá khứ. Giấy Domain Driven Web Development With WebJinn, ví dụ, là một đọc thú vị về chủ đề.

Như một ví dụ, suy nghĩ về mối quan hệ của các hình thức để các lớp khác nhau của MVC:

mẫu:

  • hình thức sao chép cấu trúc thông tin của mô hình tên miền của bạn (DM). Nếu bạn thay đổi cấu trúc này (ví dụ: bằng cách thêm trường vào cấu trúc dữ liệu hoặc bằng cách thêm thông số vào quy trình), bạn cũng phải điều chỉnh biểu mẫu để nhập thông tin đó.
  • Họ cần thông tin loại từ DM của bạn để chuyển đổi đầu vào thành các loại bắt buộc tại đó.
  • Họ cần biết các ràng buộc được chỉ định trong DM của bạn để xác thực thông tin nhập.
  • Chúng lý tưởng đọc và ghi dữ liệu trực tiếp từ/đến DM của bạn (ví dụ: đọc/ghi các trường của cấu trúc dữ liệu hoặc bằng cách gọi thủ tục trong DM với các giá trị đã gửi làm tham số).

Bộ điều khiển:

  • hình thức nhận được đệ trình dữ liệu và gửi nó vào DM.
  • Chúng thay đổi luồng chương trình tùy thuộc vào việc chúng có xác thực thành công hay không.

Xem:?

  • hình thức render như một cấu trúc phức tạp của các thẻ HTML và các thuộc tính mà phụ thuộc vào tất cả những điều trên (một lĩnh vực nên được yêu cầu lỗi nên được hiển thị như thế nào để đặt hàng các lĩnh vực? những lựa chọn để cung cấp trong một thả xuống?, vv)

Do đó, nó là không thể để viết một cơ chế hình thức trừu tượng mà không chạm vào tất cả các lớp. Giải pháp, ngược lại, là cấu trúc thư viện biểu mẫu theo MVC, vào các lớp khác nhau và các thành phần phụ đáp ứng SRP. Nếu bạn nhìn vào thành phần biểu mẫu Symfony2, nó thực hiện khá tốt. ;)

Vậy tại sao lại là một "con thú đáng sợ khổng lồ" như vậy? Vấn đề đầu tiên là sự trừu tượng hóa. Hãy nghĩ về một trình đơn thả xuống đơn giản chẳng hạn. Nếu chúng ta muốn sử dụng lại mã cho trình đơn thả xuống, chúng ta cần phải trừu tượng hóa nó bằng cách nào đó. Bây giờ hãy kiểm tra danh sách ở trên, ngay cả đầu vào đơn giản này cũng chạm vào cả ba lớp của một ứng dụng MVC. Làm thế nào bạn có thể trừu tượng cái gì đó có nghĩa là để được cấu trúc thành ba phần khác nhau?

Vấn đề thứ hai là tính năng đa dạng. Thư viện biểu mẫu không bao giờ giải quyết tất cả các vấn đề mà các nhà phát triển phải đối mặt trong cuộc sống hàng ngày của họ. Vì vậy, tất cả các lớp này và các cơ chế trừu tượng cần phải được mở rộng để bạn có thể làm cho chúng hoạt động chính xác như bạn muốn chúng.

Trong khi có thể mở rộng, thành phần Biểu mẫu đã giải quyết hàng trăm vấn đề nhỏ mà bạn thậm chí không phải suy nghĩ nữa. Cách nhập ngày tháng, cách chọn một hoặc nhiều danh sách lựa chọn bằng cách sử dụng các giao diện người dùng khác nhau (thả xuống, hộp kiểm, nút radio, v.v.), cách bảo vệ biểu mẫu một lần nữa lỗi bảo mật và nhiều chủ đề khác mà tôi có thể viết bài luận trong khoảng.

Bạn thấy thư viện biểu mẫu đó trở nên khá phức tạp. Đặt cược tốt nhất mà chúng ta có khi viết "những con thú đáng sợ" là làm cho API của họ càng đơn giản càng tốt cho người mới bắt đầu, càng linh hoạt càng tốt cho người dùng cao cấp hơn và viết tài liệu mở rộng về tận dụng toàn bộ sức mạnh của nó. Điểm cuối cùng chắc chắn vẫn còn thiếu (please help!), nhưng chúng tôi liên tục làm việc trên tất cả những điều trên.

Giảm sự phức tạp cho một vấn đề đơn giản, mặt khác, thật không may là không thể.

Còn các thư viện biểu mẫu khác thì đơn giản như thế nào? Theo quan điểm khiêm tốn của tôi, chúng thậm chí không cố gắng giải quyết phần lớn các vấn đề mà thành phần Symfony2 Form đã giải quyết cho bạn. :)

Cập nhật ngày 24 tháng 1 năm 2014: Đối với bất kỳ ai muốn biết thêm (nhiều hơn nữa), đây là a paper that I published on the subject.

+0

Bạn có nhớ xây dựng những gì bạn cho là một mô hình * miền * không? Nếu bất cứ điều gì, thành phần biểu mẫu của Symfony kích thích mô hình thiếu máu ... –

+0

Hãy để tôi làm rõ những gì tôi yêu cầu. Bạn nói ví dụ: ** Biểu mẫu nhân rộng cấu trúc của mô hình miền của bạn (DM). ** Tôi không thể không đồng ý với bạn mạnh mẽ hơn. Chúng sẽ cho phép bạn sửa đổi mô hình miền bằng cách thực hiện các phương thức đại diện cho hành vi. Đưa mô hình miền của bạn vào các biểu mẫu là một trong những giả định tồi tệ nhất mà thành phần Form được xây dựng trên đó. –

+1

Tôi đang đề cập đến cấu trúc thông tin. Nếu mô hình miền của bạn mô hình "nhân viên" và bạn có các biểu mẫu để sửa đổi dữ liệu của những nhân viên này, bạn sẽ phải điều chỉnh biểu mẫu nếu cấu trúc thông tin của mô hình miền thay đổi (ví dụ: bạn xóa ngày sinh nhưng thêm số bảo hiểm xã hội thay thế). –

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