Cómo acceder a los parámetros de ruta, publicación, obtención, etc.en Zend Framework 2

98

¿Cómo puedo obtener varios parámetros relacionados con la solicitud de página en zf2? Al igual que los parámetros de publicación / obtención, la ruta a la que se accede, los encabezados enviados y los archivos cargados.

Matsemann
fuente

Respuestas:

205

La forma más sencilla de hacerlo sería utilizar el complemento Params, introducido en beta5. Tiene métodos de utilidad para facilitar el acceso a diferentes tipos de parámetros. Como siempre, leer las pruebas puede resultar valioso para comprender cómo se supone que se debe usar algo.

Obtenga un valor único

Para obtener el valor de un parámetro con nombre en un controlador, deberá seleccionar el método apropiado para el tipo de parámetro que está buscando y pasar el nombre.

Ejemplos:

$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

 

Valores predeterminados

Todos estos métodos también admiten valores predeterminados que se devolverán si no se encuentra ningún parámetro con el nombre dado.

Ejemplo:

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

Al visitar http://example.com/?orderby=birthdate , $ orderBy tendrá el valor fecha de nacimiento .
Al visitar http://example.com/ , $ orderBy tendrá el nombre del valor predeterminado .
 

Obtener todos los parámetros

Para obtener todos los parámetros de un tipo, simplemente no pase nada y el complemento Params devolverá una matriz de valores con sus nombres como claves.

Ejemplo:

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

Cuando visite http://example.com/?orderby=birthdate&filter=hasphone $ allGetValues será una matriz como

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

 

No usar el complemento Params

Si verifica el código fuente del complemento Params, verá que es solo una envoltura delgada alrededor de otros controladores para permitir una recuperación de parámetros más consistente. Si por alguna razón desea / necesita acceder a ellos directamente, puede ver en el código fuente cómo se hace.

Ejemplo:

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

NOTA: Podría haber utilizado las superglobales $ _GET, $ _POST, etc., pero no se recomienda.

Matsemann
fuente
4
También es posible llamar directamente al complemento params, es un atajo a fromRoute ():$this->params('key', 'default')
Robin
@Robin eso es cierto. Tenga en cuenta que no puede usarlo para obtener todos los parámetros de ruta, porque llamarlo sin parámetros devolverá el complemento Params y no las cosas de ruta.
Matsemann
1
+1 para el comentario de las pruebas unitarias + enlace. Pocos piensan en revisar las pruebas unitarias por alguna razón.
Xunnamius
4

La forma más fácil de obtener una cadena json publicada, por ejemplo, es leer el contenido de 'php: // input' y luego decodificarlo. Por ejemplo, tenía una ruta 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',
                ),
            ),
        ),

y quería publicar datos en él usando $ http.post de Angular. La publicación estuvo bien, pero el método de recuperación en Zend

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

no obtuve nada en este caso. Entonces, mi solución fue, después de probar todo tipo de métodos como $ _POST y los otros métodos mencionados anteriormente, leer desde 'php: //':

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

Obtuve mi matriz json al final. Espero que esto ayude.

Susy11
fuente
1
Si necesita el cuerpo POST sin procesar, use getContent () del objeto de solicitud. Desde un controlador, podría hacer:$content = $this->getRequest()->getContent()
Torin Finnemann
En ZF2, ¿cómo podemos recuperar un parámetro de URL en forma 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
fuente
0

Todos los métodos anteriores funcionarán bien si su tipo de contenido es "application / -www-form-urlencoded". Pero si su tipo de contenido es "application / json", tendrá que hacer lo siguiente:

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

Motivo: consulte el n. ° 7 en https://www.toptal.com/php/10-most-common-mistakes-php-programmers-make

Lakshmi Ramakrishnan
fuente
0

Si no tiene acceso al complemento, por ejemplo, fuera del controlador, puede obtener parámetros de servicelocator como este

//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
fuente