web-dev-qa-db-fra.com

Comment accéder aux paramètres route, post, obtenir etc. dans Zend Framework 2

Comment obtenir différents paramètres liés à la demande de page dans zf2? Comme les paramètres post/get, la route à suivre, les en-têtes envoyés et les fichiers téléchargés.

94
Matsemann

Le moyen le plus simple de le faire serait d'utiliser le plugin Params , introduit dans la version 5. Il dispose de méthodes utilitaires facilitant l’accès à différents types de paramètres. Comme toujours, la lecture de les tests peut s'avérer utile pour comprendre comment quelque chose est censé être utilisé.

Obtenir une valeur unique

Pour obtenir la valeur d'un paramètre nommé dans un contrôleur, vous devez sélectionner la méthode appropriée pour le type de paramètre que vous recherchez et transmettre le nom.

Exemples:

$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

Les valeurs par défaut

Toutes ces méthodes prennent également en charge les valeurs par défaut qui seront renvoyées si aucun paramètre portant le nom donné n’est trouvé.

Exemple:

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

Lors de la visite http://example.com/?orderby=birthdate , $ orderBy aura la valeur date de naissance .
Lors de la visite de http://example.com/ , $ orderBy aura la valeur par défaut valeur nom .

Obtenir tous les paramètres

Pour obtenir tous les paramètres d'un type, il suffit de ne rien transmettre et le plugin Params renverra un tableau de valeurs avec leurs noms comme clés.

Exemple:

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

Lors de la visite http://example.com/?orderby=birthdate&filter=hasphone $ allGetValues ​​ sera un tableau du type

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

Ne pas utiliser le plugin Params

Si vous vérifiez le code source du plug-in Params, vous verrez qu'il ne s'agit que d'une mince couche entourant d'autres contrôleurs afin de permettre une extraction plus cohérente des paramètres. Si, pour une raison quelconque, vous souhaitez/devez y accéder directement, vous pouvez voir dans le code source comment cela fonctionne.

Exemple:

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

NOTE: Vous auriez pu utiliser les superglobales $ _GET, $ _POST etc., mais cela est déconseillé.

203
Matsemann

Le moyen le plus simple d'obtenir une chaîne JSON publiée, par exemple, consiste à lire le contenu de 'php: // input', puis à le décoder. Par exemple, j'ai eu un itinéraire simple Zend:

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

et je voulais poster des données en utilisant $ http.post de Angular. Le courrier était bien mais la méthode de retrive à Zend 

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

n'a rien eu dans ce cas. Ainsi, ma solution était, après avoir essayé toutes sortes de méthodes comme $ _POST et les autres méthodes mentionnées ci-dessus, de lire 'php: //':

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

J'ai eu mon tableau JSON à la fin. J'espère que cela t'aides.

4
Susy11
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;
1
Ankit Vishwakarma

Toutes les méthodes ci-dessus fonctionneront correctement si votre type de contenu est "application/-www-form-urlencoded". Mais si votre type de contenu est "application/json", vous devrez procéder comme suit:

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

Raison: Voir # 7 dans https://www.toptal.com/php/10-most-common-mistakes-php-programmers-make

0

Si vous n’avez pas accès au plug-in, par exemple en dehors du contrôleur

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