Symfony2 अनुरोध ऑब्जेक्ट में POST मान एक्सेस करें


93

ठीक है, यह एक नौसिखिया सवाल है, लेकिन मुझे इसका जवाब कहीं नहीं मिल रहा है। Symfony2 में एक नियंत्रक में, मैं अपने एक फॉर्म से POST मूल्य का उपयोग करना चाहता हूं। नियंत्रक में मेरे पास है:

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');

दुर्भाग्य से $name_valueकुछ भी नहीं लौट रहा है। मैं क्या गलत कर रहा हूं? धन्यवाद!

जवाबों:


99

सिम्फनी 2.2

यह समाधान 2.3 से हटा दिया गया है और 3.0 में हटा दिया जाएगा, प्रलेखन देखें

$form->getData();

आपको प्रपत्र पैरामीटर के लिए एक सरणी देता है

से symfony2 किताब पेज 162 (अध्याय 12: फ़ॉर्म के लिए)

[...] कभी-कभी, आप बस एक वर्ग के बिना एक फार्म का उपयोग करना चाहते हैं, और प्रस्तुत डेटा की एक सरणी वापस पा सकते हैं। यह वास्तव में आसान है:

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
}

आप अनुरोध ऑब्जेक्ट के माध्यम से सीधे POST मान (इस मामले में "नाम") तक पहुंच सकते हैं, जैसे:

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

हालांकि, सलाह दी जाती है कि ज्यादातर मामलों में गेटडेटा () पद्धति का उपयोग करना एक बेहतर विकल्प है, क्योंकि यह डेटा (आमतौर पर एक वस्तु) को फॉर्म के ढांचे में तब्दील होने के बाद लौटाता है।

जब आप प्रपत्र टोकन को एक्सेस करना चाहते हैं, तो आपको समस्याग्रस्त के उत्तर का उपयोग करना होगा $postData = $request->request->get('contact');क्योंकि getData()तत्व को सरणी से हटा देता है


सिम्फनी 2.3

2.3 के बाद से आप का उपयोग करना चाहिए handleRequestके बजाय bindRequest:

 $form->handleRequest($request);

प्रलेखन देखें


4
यह बहुत अच्छा है, और अब सबसे अच्छा जवाब है। $ फॉर्म-> getData () मौजूद नहीं था या जब मैंने सवाल पूछा तो दस्तावेज नहीं था।
Acyra

4
डेटा को नए संस्करणों में बनाने के लिए अनुरोध करने के लिए आपको $ फॉर्म का उपयोग करना चाहिए-> हैंडल रीपेस्टेस्ट ($ अनुरोध); $ फॉर्म के बजाय-> सबमिट ($ अनुरोध); मुझे लगता है। अधिक जानकारी symfony.com/doc/2.3/book/forms.html#handling-form-submissions
adridev

127

अनुरोध में प्रपत्र नाम के तहत प्रपत्र पोस्ट मान संग्रहीत किए जाते हैं। उदाहरण के लिए, यदि आपने getName()"संपर्क" वापस करने के लिए ContactType () की विधि को ओवरराइड किया है, तो आप ऐसा करेंगे:

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

यदि आप अभी भी समस्या हो रही है, एक करने का प्रयास करें var_dump()पर $request->request->all()सभी पोस्ट मूल्यों को देखने के लिए।


2
धन्यवाद। Var_dump मदद की, मैं प्रपत्र डेटा जैसे $ POSTDATA = $ अनुरोध> अनुरोध> प्राप्त ( 'acme_somebundle_contact_type') ठीक करने के लिए एक पूरा नाम के साथ इस पर हमला कर समाप्त हो गया
Acyra

1
नीचे दिए गए टाइमशेव का उत्तर देखें, क्योंकि यह पूछा गया था, Symfony2 ने एक नई विधि जोड़ी: $ form-> getData ();
Acyra

2
आप ओवरराइड कर दिया है तो getName(), तो यह hardcode नाम करने के लिए समझ में आता है:$request->request->get($form->getName());
meze

धन्यवाद .. मेरा बहुत समय बच गया :) चीयर्स !!
अंजना सिल्वा

38

जो मेरे लिए काम कर रहा था, उसका उपयोग कर रहा था:

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

इस समस्या का उल्लेख किया गया है, + देखें @meze की टिप्पणी
phpsherpa

17

ParameterBag::get()विधि के साथ एक चाल है । आप अतिरिक्त चर के बिना आवश्यक गहरी नेस्टेड मान के लिए $deepपैरामीटर सेट trueऔर एक्सेस कर सकते हैं :

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

साथ ही आपको डिफ़ॉल्ट मान ( get()विधि का दूसरा पैरामीटर ) सेट करने की संभावना है , यह निरर्थक isset($form['some']['deep']['data'])कॉल से बच सकता है ।


तीसरे पैरामीटर को 3.0 से हटा दिया गया है और हटा दिया गया है : 3.0 में से हटाए जाने के लिए, संस्करण 2.8 के बाद से गहरी वस्तुओं का पता लगाना है। : github.com/symfony/symfony/blob/…
AL

8

फ़ील्ड डेटा को एक नियंत्रक में एक्सेस किया जा सकता है: सूची 12-34

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

इसके अलावा, अनमैप्ड फ़ील्ड का डेटा भी सीधे संशोधित किया जा सकता है: सूची 12-35

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

पृष्ठ 164 सिम्फनी 2 पुस्तक (9 अक्टूबर 2013 को जेनरेट की गई)


7

मैं अपने मल्टीपार्ट पोस्ट अनुरोध के लिए टिकटनंबर पैरामीटर को निम्न तरीके से एक्सेस करता हूं।

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

1

मुझे लगता है कि अनुरोध डेटा प्राप्त करने के लिए, प्रपत्र ऑब्जेक्ट द्वारा बाध्य और मान्य है, आपको इसका उपयोग करना चाहिए:

$form->getClientData();


7
getClientData को हटा दिया गया है। GetData का उपयोग करें, getViewData, getNormData .... फॉर्म घटक SF2 में वास्तव में गड़बड़ है (वे वास्तव में जावा दुनिया और शांत RequestDataBinder .... से प्रेरित होना चाहिए)
थॉमस Decaux

0

अनुरोध डेटा प्राप्त करने के लिए सिम्फनी डॉक्टर

अंत में, अनुरोध निकाय के साथ भेजे गए कच्चे डेटा को getContent () का उपयोग करके एक्सेस किया जा सकता है:

$ सामग्री = $ अनुरोध-> getContent ();


-14

यदि आप नौसिखिया हैं, तो सिम्फनी 2, एक ओपन-सोर्स प्रोजेक्ट में आपका स्वागत है, यदि आप बहुत कुछ सीखना चाहते हैं, तो आप स्रोत खोल सकते हैं!

"Form.php" से:

getData () getNormData () getViewData ()

आप इस फ़ाइल में अधिक जानकारी पा सकते हैं।


हमेशा सिम्फनी तरीके का उपयोग करें, $ _POST, $ अनुरोध गंदा है
थॉमस डेकाक्स

हाँ, मैं स्पष्टीकरण के लिए अच्छा नहीं हूं ^ ^ लेकिन यह उसी समाधान की तुलना में है जिसकी पुष्टि की गई है $form->getData();कि मैं जानता हूं कि लोग आलसी हैं और बिना कुछ सोचे समझे समाधान चाहते हैं;
थॉमस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.