วิธีเข้าถึงพารามิเตอร์เส้นทางโพสต์รับ ฯลฯ ใน Zend Framework 2


98

ฉันจะรับพารามิเตอร์ต่างๆที่เกี่ยวข้องกับคำขอเพจใน zf2 ได้อย่างไร เช่นเดียวกับพารามิเตอร์ post / get เส้นทางที่เข้าถึงส่วนหัวที่ส่งและไฟล์ที่อัปโหลด

คำตอบ:


206

วิธีที่ง่ายที่สุดคือใช้ปลั๊กอิน Paramsซึ่งเปิดตัวใน beta5 มีวิธียูทิลิตี้เพื่อให้ง่ายต่อการเข้าถึงพารามิเตอร์ประเภทต่างๆ เช่นเคยการอ่านแบบทดสอบสามารถพิสูจน์ได้ว่ามีคุณค่าในการทำความเข้าใจว่าควรใช้บางสิ่งอย่างไร

รับค่าเดียว

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

ตัวอย่าง:

$this->params()->fromPost('paramname');   // From POST
$this->params()->fromQuery('paramname');  // From GET
$this->params()->fromRoute('paramname');  // From RouteMatch
$this->params()->fromHeader('paramname'); // From header
$this->params()->fromFiles('paramname');  // From file being uploaded

 

ค่าเริ่มต้น

วิธีการทั้งหมดนี้ยังรองรับค่าดีฟอลต์ที่จะถูกส่งกลับหากไม่พบพารามิเตอร์ที่มีชื่อที่กำหนด

ตัวอย่าง:

$orderBy = $this->params()->fromQuery('orderby', 'name');

เมื่อไปhttp://example.com/?orderby=birthdate , $ orderByจะมีค่าวันเกิด
เมื่อไปhttp://example.com/ , $ orderByจะมีค่าเริ่มต้นค่าชื่อ
 

รับพารามิเตอร์ทั้งหมด

หากต้องการรับพารามิเตอร์ทั้งหมดประเภทเดียวอย่าส่งผ่านอะไรเลยและปลั๊กอิน Params จะส่งคืนอาร์เรย์ของค่าพร้อมชื่อเป็นคีย์

ตัวอย่าง:

$allGetValues = $this->params()->fromQuery(); // empty method call

เมื่อเข้าไปที่http://example.com/?orderby=birthdate&filter=hasphone $ allGetValuesจะเป็นอาร์เรย์เช่น

array(
    'orderby' => 'birthdate',
    'filter'  => 'hasphone',
);

 

ไม่ใช้ปลั๊กอิน Params

หากคุณตรวจสอบซอร์สโค้ดสำหรับปลั๊กอิน Params คุณจะเห็นว่ามันเป็นเพียงตัวห่อบาง ๆ รอบตัวควบคุมอื่น ๆ เพื่อให้สามารถดึงพารามิเตอร์ที่สอดคล้องกันมากขึ้น หากคุณต้องการ / จำเป็นต้องเข้าถึงโดยตรงด้วยเหตุผลบางประการคุณสามารถดูในซอร์สโค้ดว่ามันทำอย่างไร

ตัวอย่าง:

$this->getRequest()->getRequest('name', 'default');
$this->getEvent()->getRouteMatch()->getParam('name', 'default');

หมายเหตุ:คุณสามารถใช้ superglobals $ _GET, $ _POST และอื่น ๆ ได้ แต่ก็ไม่น่าสนใจ


4
นอกจากนี้ยังสามารถเรียกปลั๊กอิน params ได้โดยตรงซึ่งเป็นทางลัดไปยัง fromRoute ():$this->params('key', 'default')
Robin

@ โรบินที่แท้. โปรดทราบว่าคุณไม่สามารถใช้เพื่อดึงพารามิเตอร์เส้นทางทั้งหมดได้เนื่องจากการเรียกโดยไม่มีพารามิเตอร์จะส่งคืนปลั๊กอิน Params และไม่กำหนดเส้นทางสิ่งต่างๆ
Matsemann

1
+1 สำหรับหน่วยทดสอบความคิดเห็น + ลิงค์ ไม่กี่คิดที่จะตรวจสอบการทดสอบหน่วยด้วยเหตุผลบางประการ
Xunnamius

4

ตัวอย่างเช่นวิธีที่ง่ายที่สุดในการรับสตริง json ที่โพสต์คือการอ่านเนื้อหาของ 'php: // input' จากนั้นจึงถอดรหัส ตัวอย่างเช่นฉันมีเส้นทาง Zend ง่ายๆ:

'save-json' => array(
'type' => 'Zend\Mvc\Router\Http\Segment',
            'options' => array(
                'route'    => '/save-json/',
                'defaults' => array(
                    'controller' => 'CDB\Controller\Index',
                    'action'     => 'save-json',
                ),
            ),
        ),

และฉันต้องการโพสต์ข้อมูลโดยใช้ $ http.post ของ Angular โพสต์นั้นใช้ได้ แต่วิธี retrive ใน Zend

$this->params()->fromPost('paramname'); 

ไม่ได้อะไรเลยในกรณีนี้ ดังนั้นวิธีแก้ปัญหาของฉันคือหลังจากลองใช้ทุกวิธีเช่น $ _POST และวิธีการอื่น ๆ ที่ระบุไว้ข้างต้นเพื่ออ่านจาก 'php: //':

$content = file_get_contents('php://input');
print_r(json_decode($content));

ฉันได้รับอาร์เรย์ json ของฉันในตอนท้าย หวังว่านี่จะช่วยได้


1
หากคุณต้องการเนื้อหา POST แบบดิบให้ใช้ getContent () ของอ็อบเจ็กต์คำขอ จากคอนโทรลเลอร์คุณสามารถทำได้:$content = $this->getRequest()->getContent()
Torin Finnemann

บน ZF2 เราจะดึงพารามิเตอร์ URL ในรูปแบบของ?name=mike?
เตเฟน

1
require_once 'lib/Zend/Loader/StandardAutoloader.php';
$loader = new Zend\Loader\StandardAutoloader(array('autoregister_zf' => true));

$loader->registerNamespace('Http\PhpEnvironment', 'lib/Zend/Http'); 

// Register with spl_autoload:
$loader->register();

$a = new Zend\Http\PhpEnvironment\Request();
print_r($a->getQuery()->get()); exit;

0

วิธีการทั้งหมดข้างต้นจะทำงานได้ดีถ้าประเภทเนื้อหาของคุณเป็น "application / -www-form-urlencoded" แต่ถ้าประเภทเนื้อหาของคุณคือ "application / json" คุณจะต้องดำเนินการดังต่อไปนี้:

$ params = json_decode (file_get_contents ('php: // input') จริง); print_r ($ params);

เหตุผล: ดู # 7 ในhttps://www.toptal.com/php/10-most-common-mistakes-php-programmers-make


0

หากคุณไม่สามารถเข้าถึงปลั๊กอินได้เช่นภายนอกตัวควบคุมคุณสามารถรับพารามิเตอร์จาก servicelocator ได้เช่นนี้

//from POST
$foo = $this->serviceLocator->get('request')->getPost('foo'); 
//from GET
$foo = $this->serviceLocator->get('request')->getQuery()->foo;
//from route
$foo = $this->serviceLocator->get('application')->getMvcEvent()->getRouteMatch()->getParam('foo');
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.