Cara mengakses parameter route, post, get etc. di Zend Framework 2

98

Bagaimana saya bisa mendapatkan berbagai parameter yang terkait dengan permintaan halaman di zf2? Seperti parameter post / get, rute sedang diakses, header dikirim dan file diunggah.

Matsemann
sumber

Jawaban:

205

Cara termudah untuk melakukannya adalah dengan menggunakan plugin Params , yang diperkenalkan di beta5. Ini memiliki metode utilitas untuk membuatnya mudah mengakses berbagai jenis parameter. Seperti biasa, membaca tes terbukti bermanfaat untuk memahami bagaimana sesuatu seharusnya digunakan.

Dapatkan satu nilai

Untuk mendapatkan nilai parameter bernama dalam pengontrol, Anda harus memilih metode yang sesuai untuk jenis parameter yang Anda cari dan meneruskan namanya.

Contoh:

$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

 

Nilai dasar

Semua metode ini juga mendukung nilai default yang akan dikembalikan jika tidak ada parameter dengan nama yang diberikan ditemukan.

Contoh:

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

Saat mengunjungi http://example.com/?orderby=birthdate , $ orderBy akan memiliki nilai tanggal lahir .
Saat mengunjungi http://example.com/ , $ orderBy akan memiliki nama nilai default .
 

Dapatkan semua parameter

Untuk mendapatkan semua parameter dari satu jenis, jangan berikan apa pun dan plugin Params akan mengembalikan array nilai dengan namanya sebagai kunci.

Contoh:

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

Saat mengunjungi http://example.com/?orderby=birthdate&filter=hasphone $ allGetValues akan menjadi larik seperti

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

 

Tidak menggunakan plugin Params

Jika Anda memeriksa kode sumber untuk plugin Params, Anda akan melihat bahwa itu hanya pembungkus tipis di sekitar pengontrol lain untuk memungkinkan pengambilan parameter yang lebih konsisten. Jika Anda karena suatu alasan ingin / perlu mengaksesnya secara langsung, Anda dapat melihat di kode sumber bagaimana hal itu dilakukan.

Contoh:

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

CATATAN: Anda bisa saja menggunakan superglobals $ _GET, $ _POST dll, tetapi itu tidak disarankan.

Matsemann
sumber
4
Memanggil plugin params secara langsung juga dimungkinkan, ini adalah jalan pintas ke fromRoute ():$this->params('key', 'default')
Robin
@Robin itu benar. Perhatikan bahwa Anda tidak dapat menggunakannya untuk mengambil semua parameter rute, karena memanggilnya tanpa parameter akan mengembalikan plugin Params dan bukan item rute.
Matsemann
1
+1 untuk komentar + tautan unit test. Beberapa berpikir untuk memeriksa tes unit untuk beberapa alasan.
Xunnamius
4

Cara termudah untuk mendapatkan string json yang diposting, misalnya, adalah membaca konten 'php: // input' dan kemudian mendekodekannya. Misalnya saya punya rute Zend sederhana:

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

dan saya ingin mengirim data ke sana menggunakan $ http.post Angular. Posting itu baik-baik saja tetapi metode retrive di Zend

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

tidak mendapatkan apa-apa dalam kasus ini. Jadi solusi saya adalah, setelah mencoba semua jenis metode seperti $ _POST dan metode lain yang disebutkan di atas, membaca dari 'php: //':

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

Saya mendapatkan array json saya pada akhirnya. Semoga ini membantu.

Susy11
sumber
1
Jika Anda membutuhkan badan POST mentah, gunakan getContent () dari objek permintaan. Dari pengontrol, Anda dapat melakukan:$content = $this->getRequest()->getContent()
Torin Finnemann
Di ZF2, bagaimana kita bisa mengambil parameter URL dalam bentuk ?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;
Ankit Vishwakarma
sumber
0

Semua metode di atas akan bekerja dengan baik jika tipe konten Anda adalah "application / -www-form-urlencoded". Tetapi jika tipe konten Anda adalah "application / json" maka Anda harus melakukan hal berikut:

$ params = json_decode (file_get_contents ('php: // input'), true); print_r ($ params);

Alasan: Lihat # 7 di https://www.toptal.com/php/10-most-common-mistakes-php-programmers-make

Lakshmi Ramakrishnan
sumber
0

Jika Anda tidak memiliki akses ke plugin misalnya di luar controller Anda bisa mendapatkan params dari servicelocator seperti ini

//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');
Marcin Żurek
sumber