Risposte:
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.
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.
$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
Tutti questi metodi supportano anche i valori predefiniti che verranno restituiti se non viene trovato alcun parametro con il nome specificato.
$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 .
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.
$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',
);
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.
$this->getRequest()->getRequest('name', 'default');
$this->getEvent()->getRouteMatch()->getParam('name', 'default');
NOTA: avresti potuto usare i superglobali $ _GET, $ _POST ecc., Ma è sconsigliato.
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.
$content = $this->getRequest()->getContent()
?name=mike
?
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;
Tutti i metodi precedenti funzioneranno bene se il tipo di contenuto è "application / -www-form-urlencoded". Ma se il tuo tipo di contenuto è "application / json", dovrai fare quanto segue:
$ params = json_decode (file_get_contents ('php: // input'), true); print_r ($ params);
Motivo: vedi # 7 in https://www.toptal.com/php/10-most-common-mistakes-php-programmers-make
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');
$this->params('key', 'default')