Cách truy cập các tham số route, post, get, v.v. trong Zend Framework 2


98

Làm cách nào để nhận các tham số khác nhau liên quan đến yêu cầu trang trong zf2? Như tham số post / get, tuyến đường đang được truy cập, tiêu đề được gửi và tệp được tải lên.

Câu trả lời:


205

Cách dễ nhất để làm điều đó là sử dụng plugin Params , được giới thiệu trong bản beta5. Nó có các phương thức tiện ích để giúp bạn dễ dàng truy cập các loại tham số khác nhau. Như mọi khi, việc đọc các bài kiểm tra có thể chứng minh giá trị để hiểu cách sử dụng thứ gì đó.

Nhận một giá trị duy nhất

Để nhận giá trị của một tham số đã đặt tên trong bộ điều khiển, bạn sẽ cần chọn phương thức thích hợp cho loại tham số bạn đang tìm kiếm và chuyển vào tên.

Ví dụ:

$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

 

Giá trị mặc định

Tất cả các phương thức này cũng hỗ trợ các giá trị mặc định sẽ được trả về nếu không tìm thấy tham số nào có tên đã cho.

Thí dụ:

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

Khi truy cập http://example.com/?orderby=birthdate , $ orderBy sẽ có giá trị ngày sinh .
Khi truy cập http://example.com/ , $ orderBy sẽ có tên giá trị mặc định .
 

Nhận tất cả các thông số

Để nhận tất cả các tham số của một loại, chỉ cần không chuyển bất kỳ thứ gì vào và plugin Params sẽ trả về một mảng giá trị với tên của chúng là khóa.

Thí dụ:

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

Khi truy cập http://example.com/?orderby=birthdate&filter=hasphone $ allGetValues sẽ là một mảng như

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

 

Không sử dụng plugin Params

Nếu bạn kiểm tra mã nguồn cho plugin Params, bạn sẽ thấy rằng nó chỉ là một lớp bọc mỏng xung quanh các bộ điều khiển khác để cho phép truy xuất tham số nhất quán hơn. Nếu vì lý do nào đó bạn muốn / cần truy cập trực tiếp vào chúng, bạn có thể xem trong mã nguồn cách thực hiện.

Thí dụ:

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

LƯU Ý: Bạn có thể đã sử dụng superglobals $ _GET, $ _POST, v.v., nhưng điều đó không được khuyến khích.


4
Gọi params cắm trực tiếp cũng có thể, đó là một phím tắt để fromRoute ():$this->params('key', 'default')
Robin

@Robin đó là sự thật. Lưu ý rằng bạn không thể sử dụng nó để tìm nạp tất cả các tham số định tuyến, bởi vì việc gọi nó không có tham số sẽ trả về trình cắm Params chứ không phải nội dung định tuyến.
Matsemann

1
+1 cho các bài kiểm tra đơn vị bình luận + liên kết. Ít ai nghĩ rằng để kiểm tra các bài kiểm tra đơn vị vì một số lý do.
Xunnamius

4

Ví dụ, cách dễ nhất để lấy một chuỗi json đã đăng là đọc nội dung của 'php: // input' và sau đó giải mã nó. Ví dụ, tôi có một tuyến đường Zend đơn giản:

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

và tôi muốn đăng dữ liệu lên nó bằng cách sử dụng $ http.post của Angular. Bài đăng tốt nhưng phương pháp truy xuất trong Zend

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

không nhận được bất cứ điều gì trong trường hợp này. Vì vậy, giải pháp của tôi là, sau khi thử tất cả các loại phương thức như $ _POST và các phương thức khác được nêu ở trên, để đọc từ 'php: //':

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

Cuối cùng thì tôi đã có mảng json của mình. Hi vọng điêu nay co ich.


1
Nếu bạn cần nội dung POST thô, hãy sử dụng getContent () của đối tượng yêu cầu. Từ một bộ điều khiển, bạn có thể làm:$content = $this->getRequest()->getContent()
Torin Finnemann

Trên ZF2, làm thế nào chúng ta có thể truy xuất một tham số URL ở dạng ?name=mike?
Stephane

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

Nếu Bạn không có quyền truy cập vào plugin, chẳng hạn như bên ngoài bộ điều khiển, Bạn có thể nhận các thông số từ bộ định vị dịch vụ như thế này

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