2015-07-08 18 views
6

Thành phần biểu mẫu Symfony 2 thực sự là một cái gì đó. Tôi đoán bạn biết điều đó. Cố gắng để hiểu những gì làm việc như thế nào chỉ là một nhiệm vụ dường như không thể; và tôi khá nhiều kinh nghiệm tại duyệt qua codebases .. Nhưng người đàn ông, thành phần Form .. OMGBiểu mẫu Symfony: Cách thay thế lớp biểu mẫu/truy xuất tất cả dữ liệu bổ sung?

TL; DR

Dưới đây là thông tin chi tiết, vấn đề này cố gắng hỏi

  • Is có thể thay thế lớp học \Symfony\Component\Form\Form?
  • Hoặc: Làm thế nào để dễ dàng có được tất cả dữ liệu bổ sung từ tất cả các trường dạng biểu mẫu của biểu mẫu?
  • Hoặc, một câu hỏi liên quan: Làm thế nào trên trái đất nó hoạt động nếu tôi làm $form->add('ss', 'form') - rõ ràng là lớp Core\FormType được tham gia nhưng khi tôi truy xuất lại sau, nó là một thể hiện của \Symfony\Component\Form\Form? Điều đó xảy ra ở đâu và điều này có thể bị quá tải để nó sử dụng một lớp khác không?

Chi tiết

Tình hình

Hãy tưởng tượng một điều khiển mà nhận được một JSON tải trọng n sâu. Trọng tải này được giải mã và xác thực thông qua Biểu mẫu. Bây giờ, hầu hết cấu trúc JSON này được ánh xạ bởi các Mô hình (Các thực thể của Doctrine ODM). Nhưng một số thuộc tính phụ chỉ là "băm" - khách hàng được phép đăng bất cứ điều gì anh ta muốn ở đó.
Các tài khoản con "băm" đó là các trường có dạng, được gắn cờ và có thể có thêm các trường.

Vấn đề

Tóm lại vấn đề của chúng tôi là, rằng tất cả các "trường bổ sung" không được trả về bởi $form->getData(). Chúng tôi không thể chỉ định các trường đó (và loại của chúng) vì chúng tôi không biết điều gì sẽ đến - vì vậy tất cả dữ liệu này là một phần của dữ liệu thừa.

Giải pháp?

Vì vậy, tôi nghĩ - OK - hãy sửa đổi FormFactory để nó sẽ trả về Tiện ích mở rộng tùy chỉnh của chúng tôi - một trong đó cũng trả về extraData khi getData được gọi. Dễ dàng phải không? Noo, không dễ dàng ..

Ý tưởng của tôi cho phép tôi kiểm tra FormFactory, FormBuilders, ResolvedFormTypes, whatnot .. và tại tất cả các địa điểm quan trọng (như formBuilder->getForm()) - các lớp tôi muốn ghi đè/thay thế là instanciated tĩnh - không sử dụng của DIC .. (!)

Trả lời

0

Tôi đã đọc ở đâu đó rằng thành phần Biểu mẫu trong Symfony 2 được viết bởi chính ma quỷ để cho phép nhà phát triển của chúng tôi phát điên. May mắn thay, tôi không quá cố gắng tự mình thay thế toàn bộ thành phần Biểu mẫu;)

Thỉnh thoảng, khi bạn xác định biểu mẫu (bằng cách tạo một lớp <entity>Type, như UserType), bạn đang xác định loại mới có thể đơn giản như một đầu vào văn bản đơn lẻ hoặc phức tạp như dạng chính thức (số UserType của chúng tôi từ trước đó).Hình thức "thực" (Symfony\Component\Form\Form) được tạo ra từ định nghĩa kiểu của bạn:

return $this->container->get('form.factory')->create(
    new UserType(), new User(), $options 
); 

Bạn đã đánh giá các ý tưởng để tạo ra một loại hình thức tùy chỉnh cho bạn "extraData"? Hoặc có thể nó có thể được ánh xạ dưới dạng chuỗi JSON được tạo bởi JavaScript phía máy khách trước khi gửi.

+0

Điều này thực sự là đúng cách để đi .. Mặc dù tôi đã tìm ra sau khi đặt câu hỏi. Vì vậy, hãy tìm hiểu: Nếu muốn lưu trữ các cấu trúc linh hoạt lớn từ các tải trọng JSON, người ta phải định nghĩa một FormType mở rộng 'Symfony \ Component \ Form \ AbstractType' (như' lớp FreeForm mở rộng AbstractType') - sau đó có 'getParent()' return 'text 'và về cơ bản bạn có thể lưu trữ bên trong những gì bạn mong muốn. – narcoticfresh

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