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

98

Comment puis-je obtenir divers paramètres liés à la demande de page dans zf2? Comme les paramètres post / get, la route accédée, les en-têtes envoyés et les fichiers téléchargés.

Matsemann
la source

Réponses:

205

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

Obtenez une valeur unique

Pour obtenir la valeur d'un paramètre nommé dans un contrôleur, vous devrez sélectionner la méthode appropriée pour le type de paramètre que vous recherchez et passer 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');

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

Obtenez tous les paramètres

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

Exemple:

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

Lorsque vous visitez http://example.com/?orderby=birthdate&filter=hasphone $ allGetValues sera un tableau comme

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

 

Ne pas utiliser le plugin Params

Si vous vérifiez le code source du plugin Params, vous verrez qu'il ne s'agit que d'un mince wrapper autour d'autres contrôleurs pour permettre une récupération des paramètres plus cohérente. Si, pour une raison quelconque, vous voulez / devez y accéder directement, vous pouvez voir dans le code source comment cela se fait.

Exemple:

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

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

Matsemann
la source
4
L'appel direct du plugin params est également possible, c'est un raccourci vers fromRoute ():$this->params('key', 'default')
Robin
@Robin c'est vrai. Notez que vous ne pouvez pas l'utiliser pour récupérer tous les paramètres de route, car l'appeler sans paramètres renverra le plug-in Params et ne fera pas route.
Matsemann
1
+1 pour le commentaire des tests unitaires + lien. Peu de gens pensent à vérifier les tests unitaires pour une raison quelconque.
Xunnamius
4

Le moyen le plus simple d'obtenir une chaîne json publiée, par exemple, est de lire le contenu de «php: // input», puis de le décoder. Par exemple, j'avais un itinéraire Zend simple:

'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 y publier des données en utilisant $ http.post d'Angular. Le message était bien mais la méthode de récupération dans Zend

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

n'a rien obtenu dans ce cas. Ma solution était donc, après avoir essayé toutes sortes de méthodes comme $ _POST et les autres méthodes indiquées ci-dessus, de lire à partir de 'php: //':

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

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

Susy11
la source
1
Si vous avez besoin du corps POST brut, utilisez le getContent () de l'objet de requête. À partir d'un contrôleur, vous pouvez faire:$content = $this->getRequest()->getContent()
Torin Finnemann
Sur ZF2, comment pouvons-nous récupérer un paramètre d'URL sous la forme de ?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
la source
0

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 effectuer les opérations suivantes:

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

Raison: voir n ° 7 sur https://www.toptal.com/php/10-most-common-mistakes-php-programmers-make

Lakshmi Ramakrishnan
la source
0

Si vous n'avez pas accès au plugin par exemple en dehors du contrôleur, vous pouvez obtenir des paramètres de servicelocator comme ceci

//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
la source