Truy cập các giá trị POST trong đối tượng yêu cầu Symfony2


93

OK, đây là một câu hỏi dành cho người mới, nhưng tôi không thể tìm thấy câu trả lời ở bất kỳ đâu. Trong bộ điều khiển trong Symfony2, tôi muốn truy cập giá trị POST từ một trong các biểu mẫu của mình. Trong bộ điều khiển, tôi có:

public function indexAction()
{ 
    $request = $this->get('request');
    if ($request->getMethod() == 'POST') {
        $form = $this->get('form.factory')->create(new ContactType());
        $form->bindRequest($request);
        if ($form->isValid()) {
            $name_value = $request->request->get('name');

Thật không may $name_valuelà không trả lại bất cứ điều gì. Tôi đang làm gì sai? Cảm ơn!

Câu trả lời:


99

Symfony 2.2

giải pháp này không được dùng nữa kể từ 2.3 và sẽ bị xóa trong 3.0, xem tài liệu

$form->getData();

cung cấp cho bạn một mảng cho các tham số biểu mẫu

từ sách symfony2 trang 162 (Chương 12: Biểu mẫu)

[...] đôi khi, bạn có thể chỉ muốn sử dụng một biểu mẫu không có lớp và lấy lại một mảng dữ liệu đã gửi. Điều này thực sự rất dễ dàng:

public function contactAction(Request $request) {
  $defaultData = array('message' => 'Type your message here');
  $form = $this->createFormBuilder($defaultData)
  ->add('name', 'text')
  ->add('email', 'email')
  ->add('message', 'textarea')
  ->getForm();
  if ($request->getMethod() == 'POST') {
    $form->bindRequest($request);
    // data is an array with "name", "email", and "message" keys
    $data = $form->getData();
  }
  // ... render the form
}

Bạn cũng có thể truy cập các giá trị POST (trong trường hợp này là "tên") trực tiếp thông qua đối tượng yêu cầu, như sau:

$this->get('request')->request->get('name');

Tuy nhiên, hãy lưu ý rằng trong hầu hết các trường hợp, sử dụng phương thức getData () là lựa chọn tốt hơn, vì nó trả về dữ liệu (thường là một đối tượng) sau khi nó được khung biểu mẫu chuyển đổi.

Khi bạn muốn truy cập mã thông báo biểu mẫu, bạn phải sử dụng câu trả lời của Problematic $postData = $request->request->get('contact');getData()phần tử loại bỏ khỏi mảng


Symfony 2.3

kể từ 2.3 bạn nên sử dụng handleRequestthay vì bindRequest:

 $form->handleRequest($request);

xem tài liệu


4
Điều này thật tuyệt, và bây giờ là câu trả lời tốt nhất. $ form-> getData () không tồn tại hoặc không được ghi lại khi tôi đặt câu hỏi.
Acyra

4
để ràng buộc dữ liệu yêu cầu thành biểu mẫu trong phiên bản mới nhất, bạn nên sử dụng $ form-> handleRequest ($ request); thay vì $ form-> submit ($ request); tôi nghĩ. Chi tiết thêm symfony.com/doc/2.3/book/forms.html#handling-form-submissions
adridev

127

Các giá trị bài đăng của biểu mẫu được lưu trữ dưới tên của biểu mẫu trong yêu cầu. Ví dụ: nếu bạn đã ghi đè getName()phương thức của ContactType () để trả về "liên hệ", bạn sẽ làm như sau:

$postData = $request->request->get('contact');
$name_value = $postData['name'];

Nếu bạn vẫn gặp sự cố, hãy thử tiếp var_dump()tục $request->request->all()để xem tất cả các giá trị bài đăng.


2
Cảm ơn bạn. Các var_dump giúp, tôi đã kết thúc tấn công này với một tên đầy đủ để phục hồi dữ liệu hình thức ví dụ như $ POSTDATA = $ request-> request-> get ( 'acme_somebundle_contact_type')
Acyra

1
Xem câu trả lời từ timaschew bên dưới, vì điều này đã được hỏi, Symfony2 đã thêm một phương thức mới: $ form-> getData ();
Acyra

2
Nếu bạn đã ghi đè getName(), thì không nên đặt tên mã cứng:$request->request->get($form->getName());
meze

Cảm ơn bạn .. Đã tiết kiệm rất nhiều thời gian của tôi :) Cheers !!
Anjana Silva

38

những gì làm việc cho tôi đang sử dụng cái này:

$data = $request->request->all();
$name = $data['form']['name'];

Đây là những gì có vấn đề đã đề cập, + thấy comment của @meze có
phpsherpa

17

Có một mẹo với ParameterBag::get()phương pháp. Bạn có thể thiết lập $deepthông số để truevà truy cập các giá trị yêu cầu lồng nhau sâu mà không biến thêm:

$request->request->get('form[some][deep][data]', null, true);

Ngoài ra, bạn có thể đặt một giá trị mặc định (tham số thứ 2 của get()phương thức), nó có thể tránh được isset($form['some']['deep']['data'])cuộc gọi dư thừa .


Tham số thứ ba không được dùng nữa và bị xóa khỏi 3.0 Lưu ý: Tính năng tìm mục sâu không được dùng nữa kể từ phiên bản 2.8, sẽ bị xóa trong 3.0. : github.com/symfony/symfony/blob/…
AL

8

Dữ liệu trường có thể được truy cập trong bộ điều khiển với: Liệt kê 12-34

$form->get('dueDate')->getData();

Ngoài ra, dữ liệu của một trường chưa được ánh xạ cũng có thể được sửa đổi trực tiếp:

$form->get('dueDate')->setData(new \DateTime());

trang 164 sách symfony2 (tạo ngày 9 tháng 10 năm 2013)


7

Tôi truy cập tham số ticketNumber cho yêu cầu đăng nhiều phần của mình theo cách sau.

$data = $request->request->all();
$ticketNumber = $data["ticketNumber"];

1

Tôi nghĩ rằng để lấy dữ liệu yêu cầu, được ràng buộc và xác thực bởi đối tượng biểu mẫu, bạn phải sử dụng:

$form->getClientData();


7
getClientData không được dùng nữa. Sử dụng getData, getViewData, getNormData .... Thành phần Form thực sự lộn xộn trong SF2 (họ thực sự cần được lấy cảm hứng từ Java thế giới và RequestDataBinder mát ....)
Thomas Decaux

0

Tài liệu Symfony để lấy dữ liệu yêu cầu

Cuối cùng, dữ liệu thô được gửi cùng với phần thân yêu cầu có thể được truy cập bằng getContent ():

$ content = $ request-> getContent ();


-14

Nếu bạn là người mới, chào mừng bạn đến với Symfony2, một dự án mã nguồn mở nên nếu bạn muốn học hỏi nhiều điều, bạn có thể mở mã nguồn!

Từ "Form.php":

getData () getNormData () getViewData ()

Bạn có thể tìm thêm chi tiết trong tệp này.


Luôn luôn sử dụng cách Symfony, $ _POST, $ yêu cầu là bẩn
Thomas Decaux

Vâng tôi không tốt cho lời giải thích ^^ nhưng điều này là chính xác cùng một giải pháp hơn một sự khẳng định $form->getData();tôi biết những người lười biếng và muốn có một giải pháp mà không suy nghĩ một chút ;-(
Thomas Decaux
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.