Zend Framework 2'de rota, gönderi, alma vb. Parametrelerine nasıl erişilir


98

Zf2'de sayfa isteği ile ilgili çeşitli parametreleri nasıl alabilirim? Post / get parametreleri gibi, erişilen yol, gönderilen başlıklar ve yüklenen dosyalar.

Yanıtlar:


205

Bunu yapmanın en kolay yolu, beta5'te sunulan Params eklentisini kullanmak olacaktır . Farklı parametre türlerine erişimi kolaylaştırmak için yardımcı yöntemlere sahiptir. Her zaman olduğu gibi , testleri okumak , bir şeyin nasıl kullanılması gerektiğini anlamak için değerli olabilir.

Tek bir değer alın

Bir denetleyicide adlandırılmış bir parametrenin değerini almak için, aradığınız parametre türüne uygun yöntemi seçmeniz ve adı iletmeniz gerekir.

Örnekler:

$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

 

Varsayılan değerler

Bu yöntemlerin tümü, verilen ada sahip bir parametre bulunmazsa döndürülecek varsayılan değerleri de destekler.

Misal:

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

Ziyaret ederken http://example.com/?orderby=birthdate , $ orderBy değeri olacak doğum .
Ziyaret ederken http://example.com/ , $ orderBy olacak varsayılan değer adını .
 

Tüm parametreleri al

Bir türdeki tüm parametreleri almak için, hiçbir şeyi iletmeyin ve Params eklentisi, adları anahtar olarak olan bir değerler dizisi döndürür.

Misal:

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

Http://example.com/?orderby=birthdate&filter=hasphone $ allGetValues ziyaret edildiğinde aşağıdaki gibi bir dizi olacaktır

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

 

Params eklentisini kullanmamak

Params eklentisinin kaynak kodunu kontrol ederseniz , daha tutarlı parametre alımına izin vermek için diğer denetleyicilerin etrafında ince bir paket olduğunu göreceksiniz. Herhangi bir nedenle bunlara doğrudan erişmek istiyorsanız / ihtiyacınız varsa, bunun nasıl yapıldığını kaynak kodda görebilirsiniz.

Misal:

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

NOT: Süper küreselleri $ _GET, $ _POST vb. Kullanmış olabilirsiniz, ancak bu önerilmez.


4
Params eklentisini doğrudan çağırmak da mümkündür, fromRoute () için bir kısayol:$this->params('key', 'default')
Robin

@Robin bu doğru. Tüm rota parametrelerini almak için kullanamayacağınızı unutmayın, çünkü hiçbir parametre olmadan çağırmak Params eklentisini döndürür ve işleri yönlendirmez.
Matsemann

1
Birim testleri yorumu + bağlantı için +1. Bazı nedenlerden dolayı birim testlerini kontrol etmeyi düşünen çok az kişi var.
Xunnamius

4

Örneğin, gönderilen bir json dizesini almanın en kolay yolu, 'php: // input' içeriğini okumak ve ardından kodunu çözmek. Örneğin basit bir Zend rotam vardı:

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

ve Angular'ın $ http.post'unu kullanarak ona veri göndermek istedim. Gönderi iyiydi ama Zend'deki geri alma yöntemi

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

bu durumda hiçbir şey almadım. Bu yüzden benim çözümüm, $ _POST gibi her türlü yöntemi ve yukarıda belirtilen diğer yöntemleri denedikten sonra, 'php: //' den okumaktı:

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

Sonunda json dizimi aldım. Bu yardımcı olur umarım.


1
Ham POST gövdesine ihtiyacınız varsa, istek nesnesinin getContent () öğesini kullanın. Bir denetleyiciden şunları yapabilirsiniz:$content = $this->getRequest()->getContent()
Torin Finnemann

ZF2'de şeklinde bir URL parametresini nasıl alabiliriz ?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

Örneğin kontrolör dışında eklentiye erişiminiz yoksa servicelocator'dan bunun gibi params alabilirsiniz.

//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');
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.