วิธีรับพารามิเตอร์คำขอใน symfony2


203

ฉันยังใหม่กับ symfony ในภาษาอื่น ๆ เช่น java และอื่น ๆ ฉันสามารถใช้request.getParameter('parmeter name')เพื่อรับค่า

มีอะไรที่คล้ายกันที่เราสามารถทำได้กับ symfony2
ฉันได้เห็นตัวอย่าง แต่ไม่มีใครทำงานให้ฉัน สมมติว่าฉันมีข้อมูลแบบฟอร์มที่มีชื่อชื่อผู้ใช้ ในรูปแบบการกระทำฉันพยายามใช้สิ่งนี้:

$request = $this->getRequest();
$username= $request->request->get('username'); 

ฉันได้ลองแล้ว

$username = $request->getParameter('username');

และ

$username=$request->request->getParameter('username');

แต่ไม่มีตัวเลือกใดทำงานได้ แต่การติดตามต่อไปนี้ทำได้ดี:

foreach($request->request->all() as $req){
    print_r($req['username']);
}

ฉันทำผิดที่ใช้getParameter()วิธีการ ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม.


คุณมีการพิมพ์ผิดในสายสอง: ควรจะเป็น$request->request-get() $request->request->get()เป็นไปได้ไหม
halfer

ได้เขียนเหมือนกันใน code.missed out here.sorry สำหรับการพิมพ์ผิดที่นี่ยังคงไม่ทำงาน
อับดุลฮามิด

คุณ (a) ตรวจสอบคู่มือเพื่อให้แน่ใจว่าget()เป็นวิธีที่ถูกต้องและ (b) เปิดใช้งานประกาศ PHP เพื่อให้คุณสามารถดูว่ามีปัญหาหรือไม่? (c) Symfony 2 มีแถบเครื่องมือดีบั๊กเช่น Symfony 1 เพื่อให้คุณสามารถดูว่าคุณได้ทำผิดพลาดหรือไม่?
halfer

คุณสับสนชื่อและชื่อผู้ใช้หรือไม่
greg0ire

มีข้อมูลเพิ่มเติมที่นี่: roadtodev.com/recuperer-objet-request-de-symfony
Thomas Bredillet

คำตอบ:


416

การตั้งชื่อไม่ใช่ทุกอย่างที่ใช้งานง่าย:

use Symfony\Component\HttpFoundation\Request;

public function updateAction(Request $request)
{
    // $_GET parameters
    $request->query->get('name');

    // $_POST parameters
    $request->request->get('name');

46
มันแตกต่างจากที่ใช้กับ PHP แต่จริงๆแล้วมันสมเหตุสมผลดีกว่า $_GETdata คือข้อมูลจากสตริงการสืบค้น (ไม่GETจำเป็นต้องร้องขอเลย) และ$_POSTข้อมูลเป็นข้อมูลจากเนื้อความคำขอ (ไม่จำเป็นต้องเป็นPOSTคำขอใด ๆ ก็ได้PUT)
igorw

5
ลองใช้ $ request-> query-> get ('name'); แต่มันก็ไม่ทำงาน
อับดุลฮามิด

7
ฉันจะรับพารามิเตอร์จากคำขอ PUT ได้อย่างไร
Tjorriemorrie

10
การตั้งชื่อแปลก ๆ ที่นี่แน่นอน$request->getและ$request->postจะง่ายขึ้น
crmpicco

3
ความคิดเห็นจาก igorw นำความชัดเจนในการตั้งชื่อประหลาดนี้
Dheeraj

32

ฉันทำได้ง่ายกว่า:

use Symfony\Component\HttpFoundation\Request;

public function updateAction(Request $request)
{
    $foo = $request->get('foo');
    $bar = $request->get('bar');
}

ตัวเลือกอื่นคือการแนะนำพารามิเตอร์ของคุณในการกำหนดฟังก์ชั่นการกระทำของคุณ:

use Symfony\Component\HttpFoundation\Request;

public function updateAction(Request $request, $foo, $bar)
{
    echo $foo;
    echo $bar;
}

ซึ่งจะถือว่าคุณกำหนด {foo} และ {bar} เป็นส่วนหนึ่งของรูปแบบ URL ในไฟล์ routing.yml ของคุณ:

acme_myurl:
    pattern:  /acme/news/{foo}/{bar}
    defaults: { _controller: AcmeBundle:Default:getnews }

และในตัวอย่างแรกถ้าฉันมีfooพารามิเตอร์ทั้งในสตริงการสืบค้นและในเนื้อความ POST อัน$request->get('foo')ไหนที่จะถูกส่งกลับโดย?
Dimitry K

1
ดูเหมือนว่ามีความสำคัญกว่าเดิมคือ GET, PATH, POST api.symfony.com/master/Symfony/Component/HttpFoundation/…
Dimitry K

นี่คือคำตอบที่ดีที่สุด
steampowered

7
ไม่มันไม่ใช่. เอกสารของวิธีการบอกว่ามันเป็นกำลังใจให้ใช้เพราะมันหนักกว่าการเข้าถึงพารามิเตอร์ GET / POST ผ่านคอลเลกชันที่เฉพาะเจาะจงของพวกเขา
jurchiks

1
คำตอบคือ $request->get('foo');งานที่ถูกต้องสำหรับทุกถุง (คำสั่งซื้อคือ: PATH, GET, POST) อย่างไรก็ตาม$request->request->get('foo');ใช้ได้กับถุง POST เท่านั้น ในที่สุด$request->get()เราไม่แนะนำอันแรก ( ) หากเรารู้ว่าข้อมูลอยู่ที่ไหน (GET / POST)
F2000

18

คุณสามารถใช้รหัสต่อไปนี้เพื่อรับค่าฟิลด์แบบฟอร์มของคุณ

use Symfony\Component\HttpFoundation\Request;

public function updateAction(Request $request)
{
    // retrieve GET and POST variables respectively
    $request->query->get('foo');
    $request->request->get('bar', 'default value if bar does not exist');
}

หรือคุณสามารถรับค่าฟอร์มทั้งหมดเป็นอาร์เรย์โดยใช้

$request->request->all()

3
$ request-> request-> all () ใช้งานได้สำหรับฉัน แต่บางอย่างเช่น $ request-> query-> get ('foo'); ไม่ทำงาน.
อับดุลฮามิด

13

ลอง

$request->request->get('acme_demobundle_usertype')['username']

ตรวจสอบชื่อแอตทริบิวต์ของฟิลด์สูตรของคุณ


1
+1 เนื่องจากฉันคิดว่าของคำตอบทั้งหมดมีเพียงสิ่งนี้เท่านั้นที่ระบุสิ่งที่ไม่ชัดเจนในกรณีที่คุณสร้างแบบฟอร์มของคุณโดยอัตโนมัติด้วยความช่วยเหลือของผู้สร้างแบบฟอร์มของ symfony ดังนั้น symfony จึงเปลี่ยนชื่อฟิลด์ฟอร์มเป็นอะไรมากกว่าที่คุณต้องการ คาดหวัง ชอบ name = "acme_demobundle_userform [field_name]"
userfuser

ไวยากรณ์ที่คุณพูดถึงที่นี่ไม่ทำงานกับ php 5.3.10 รุ่นขั้นต่ำที่จะสนับสนุนนั้นคืออะไร?
Justinas Lelys

2
@justinasLelys ลองใช้ $ userType = $ request-> request-> get ('acme_demobundle_usertype'); $ username = $ userType ['ชื่อผู้ใช้'];
sleep-er

@JustinasLelys ไวยากรณ์คือ PHP 5.4
COil

ไม่สามารถกำหนด "ชื่อผู้ใช้" ดังนั้นควรตรวจสอบด้วย "??" ดีกว่า เป็นครั้งแรก
Viktor Sydorenko

9

ภายในตัวควบคุม:

$request = $this->getRequest();
$username = $request->get('username');

6
ใน Symfony เวอร์ชั่นใหม่กว่า$this->getRequest()นั้นเลิกใช้เพื่อสนับสนุนการร้องขอไปยังแอ็คชั่นคอนโทรลเลอร์เช่น:public function showAction(Request $request, $id);
Adam Elsodaney

9

ทางเลือกของคุณ:

  1. ง่าย:
    • $request->request->get('param')( $_POST['param']) หรือ
    • $request->query->get('param')( $_GET['param'])
  2. แบบฟอร์ม Symfony ที่ดีพร้อมการตรวจสอบความถูกต้องการเปลี่ยนรูปแบบค่าและการแสดงผลแบบฟอร์มที่มีข้อผิดพลาดและคุณสมบัติอื่น ๆ :
  3. บางสิ่งบางอย่างในระหว่าง (ดูตัวอย่างด้านล่าง)
<?php
/**
 * @Route("/customers", name="customers")
 *
 * @param Request $request
 * @return Response
 */
public function index(Request $request)
{
    $optionsResolver = new OptionsResolver();
    $optionsResolver->setDefaults([
        'email' => '',
        'phone' => '',
    ]);
    $filter = $optionsResolver->resolve($request->query->all());

    /** @var CustomerRepository $customerRepository */
    $customerRepository = $this->getDoctrine()->getRepository('AppBundle:Customer');

    /** @var Customer[] $customers */
    $customers = $customerRepository->findFilteredCustomers($filter);

    return $this->render(':customers:index.html.twig', [
        'customers' => $customers,
        'filter' => $filter,
    ]);
}

เพิ่มเติมเกี่ยวกับOptionsResolver- http://symfony.com/doc/current/components/options_resolver.html


8

เนื่องจากขณะนี้$this->getRequest()วิธีการเลิกใช้แล้วคุณจำเป็นต้องฉีดRequestออบเจกต์ลงในแอคชั่นคอนโทรลเลอร์ของคุณดังนี้:

public function someAction(Request $request)

หลังจากนั้นคุณสามารถใช้วิธีใดวิธีหนึ่งต่อไปนี้

หากคุณต้องการดึงข้อมูล POST จากการใช้คำขอดังต่อไปนี้:

$request->request->get('var_name');

แต่ถ้าคุณต้องการดึงข้อมูล GET จากการร้องขอให้ใช้สิ่งนี้:

$request->query->get('var_name');

6

คุณสามารถทำได้:

$clientName = $request->request->get('appbundle_client')['clientName'];

บางครั้งเมื่อแอตทริบิวต์ได้รับการป้องกันคุณจะไม่สามารถเข้าถึงเพื่อรับค่าสำหรับวิธีการเข้าถึงโดยทั่วไป:

(POST)

 $clientName = $request->request->get('clientName');

(ได้รับ)

$clientName = $request->query->get('clientName');

(ทั่วไป)

$clientName = $request->get('clientName');

1
ยินดีต้อนรับสู่ Stack Overflow โปรดจัดรูปแบบคำตอบของคุณเพื่อให้อ่านได้ง่ายขึ้นในครั้งต่อไปและตรวจสอบหน้าความช่วยเหลือนี้: วิธีตอบ
Fabian Horlacher

เกิดอะไรขึ้นถ้ามี 2 ค่าหลังจากได้รับอะไร แบบนี้$clientName = $request->query->get('clientName','any');
Munkhdelger Tumenbayar

3

กรณีส่วนใหญ่เช่นการรับสตริงข้อความค้นหาหรือพารามิเตอร์แบบฟอร์มจะครอบคลุมในคำตอบข้างต้น

เมื่อทำงานกับข้อมูลดิบเช่นสตริง JSON ดิบในเนื้อความที่คุณต้องการให้เป็นอาร์กิวเมนต์สามารถใช้json_decode()วิธีการRequest::getContent()ได้

$content = $request->getContent();

ข้อมูลที่เป็นประโยชน์เพิ่มเติมเกี่ยวกับคำขอ HTTP ใน Symfony สามารถพบได้ในเอกสารประกอบของแพ็คเกจHttpFoundation


1
$request = Request::createFromGlobals();
$getParameter = $request->get('getParameter');

นี่เป็นวิธีที่จะไปกับฟังก์ชั่นที่ไม่มีRequestพารามิเตอร์หรือไม่? (เช่นในฟังก์ชั่นส่วนตัวของคลาสตัวควบคุม)
fritzmg

1
use Symfony\Component\HttpFoundation\Request;

public function indexAction(Request $request, $id) {

    $post = $request->request->all();

    $request->request->get('username');

}

ขอบคุณคุณสามารถใช้รหัสด้านบนได้


0

หากคุณต้องการรับค่าจากตัวเลือกคุณสามารถใช้:

$form->get('nameSelect')->getClientData();

0

ลองสิ่งนี้มันใช้งานได้

$this->request = $this->container->get('request_stack')->getCurrentRequest();

ความนับถือ


นี่ไม่ได้ตอบคำถามเลย บุคคลที่ถามคำถามนี้ได้เข้าถึงวัตถุคำขอแล้ว
Layton Everson

1
@LaytonEverson ขออภัย แต่คุณเข้าใจผิดวิธีการของเขา // $ this-> getRequest () ถูกคัดค้านตั้งแต่ 2.4 นั่นคือสาเหตุที่มันไม่ทำงานดังนั้นเขาจึงไม่สามารถเข้าถึงวัตถุคำขอได้)
AchrafSoltani

แม้ว่าคุณจะไม่ผิดเกี่ยวกับสิ่งนั้นผู้ถามก็ยังสงสัยว่าวิธีใดที่ดึงตัวแปรจากวัตถุคำขอ @Cerad ตอบคำถามนี้ถูกต้อง เขาไม่เพียงให้วิธีที่ถูกต้องในการเข้าถึงวัตถุขอเขายังตอบคำถามคำถาม
Layton Everson

0
public function indexAction(Request $request)
{
   $data = $request->get('corresponding_arg');
   // this also works
   $data1 = $request->query->get('corresponding_arg1');
}

1
ในขณะที่รหัสนี้อาจตอบคำถามมันจะดีกว่าที่จะรวมบริบทอธิบายวิธีการทำงานและเวลาที่จะใช้ คำตอบแบบรหัสเท่านั้นไม่มีประโยชน์ในระยะยาว
Bono


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.