Come accedere ai parametri di route, post, ottenere ecc. In Zend Framework 2


98

Come posso ottenere vari parametri relativi alla richiesta della pagina in zf2? Come parametri post / get, percorso a cui si accede, intestazioni inviate e file caricati.

Risposte:


205

Il modo più semplice per farlo sarebbe utilizzare il plugin Params , introdotto nella beta5. Dispone di metodi di utilità per facilitare l'accesso a diversi tipi di parametri. Come sempre, leggere i test può rivelarsi prezioso per capire come dovrebbe essere usato qualcosa.

Ottieni un unico valore

Per ottenere il valore di un parametro denominato in un controller, sarà necessario selezionare il metodo appropriato per il tipo di parametro che si sta cercando e passare il nome.

Esempi:

$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

 

Valori standard

Tutti questi metodi supportano anche i valori predefiniti che verranno restituiti se non viene trovato alcun parametro con il nome specificato.

Esempio:

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

Quando visiti http://example.com/?orderby=birthdate , $ orderBy avrà il valore birthdate .
Quando visiti http://example.com/ , $ orderBy avrà il nome del valore predefinito .
 

Ottieni tutti i parametri

Per ottenere tutti i parametri di un tipo, non passare nulla e il plugin Params restituirà un array di valori con i loro nomi come chiavi.

Esempio:

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

Quando visiti http://example.com/?orderby=birthdate&filter=hasphone $ allGetValues sarà un array come

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

 

Non si utilizza il plugin Params

Se controlli il codice sorgente del plug-in Params, vedrai che è solo un sottile involucro attorno ad altri controller per consentire un recupero dei parametri più coerente. Se per qualche motivo vuoi / hai bisogno di accedervi direttamente, puoi vedere nel codice sorgente come è fatto.

Esempio:

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

NOTA: avresti potuto usare i superglobali $ _GET, $ _POST ecc., Ma è sconsigliato.


4
È anche possibile chiamare direttamente il plugin params, è una scorciatoia per fromRoute ():$this->params('key', 'default')
Robin

@Robin che è vero. Nota che non puoi usarlo per recuperare tutti i parametri del percorso, perché chiamarlo senza parametri restituirà il plug-in Params e non il materiale del percorso.
Matsemann

1
+1 per il commento + link degli unit test. Pochi pensano di controllare gli unit test per qualche motivo.
Xunnamius

4

Il modo più semplice per ottenere una stringa json pubblicata, ad esempio, è leggere il contenuto di "php: // input" e quindi decodificarlo. Ad esempio ho avuto un semplice percorso Zend:

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

e volevo inserire dei dati utilizzando $ http.post di Angular. Il post andava bene, ma il metodo di recupero in Zend

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

non ha ottenuto nulla in questo caso. Quindi la mia soluzione è stata, dopo aver provato tutti i tipi di metodi come $ _POST e gli altri metodi sopra indicati, leggere da 'php: //':

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

Alla fine ho ottenuto il mio array JSON. Spero che questo ti aiuti.


1
Se hai bisogno del corpo POST grezzo usa getContent () dell'oggetto richiesta. Da un controller, potresti fare:$content = $this->getRequest()->getContent()
Torin Finnemann

Su ZF2 come possiamo recuperare un parametro URL sotto forma di ?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

Se non hai accesso al plugin, ad esempio al di fuori del controller, puoi ottenere i parametri da servicelocator in questo modo

//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');
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.