Obtener los parámetros $ _GET de la ruta en Zend Framework 2

Zend Framework 1 tenía una forma muy simple de analizar rutas de URL y establecer parámetros encontrados en $ _GET superglobal para facilitar el acceso. Claro, podría usar -> getParam ($ something) dentro del controlador, pero si el parámetro se encontraba en la URL, también se podía acceder a través de $ _GET.

Ejemplo para url mypage.com/mymodule/mycontroller/myaction/someparam/5:

ZF1

 $this->getParam('someparam'); // 5 $_GET['someparam']; // 5 

ZF2

 $this->getEvent()->getRouteMatch()->getParam('someparam'); // 5 $_GET['someparam'] // undefined index someparam 

Obviamente, la diferencia es que ZF2 NO pone los parámetros de ruta en $ _GET superglobal.

¿Cómo puedo hacer que ponga los parámetros analizados en $ _GET superglobal, ya que extender el controlador y simplemente definir un constructor que lo haga está fuera de discusión (porque RouteMatch todavía no es un objeto y no se puede invocar desde el constructor del controlador)?

Llamando $_GET = $this->getEvent()->getRouteMatch()->getParam('someparam'); en cada uno de mis controladores funcionaría, pero no quiero eso.

En otras palabras, siguiendo el URL de ejemplo de arriba, quiero poder $ _GET [‘someparam’] y aún obtener el valor “5” en cualquier componente de la aplicación.

Editar: Parece que no estaba lo suficientemente claro, así que trataré de aclarar un poco más. Quiero que cualquier parámetro que ingrese en la URL a través de / key / value formation esté disponible en $ _GET al instante. Realmente no tengo ningún problema con obtener el param, sé cómo obtenerlo y extendí el controlador de Zend para poder llamar $ this-> getParams de nuevo como en ZF1, y ahora todos los controladores lo extienden, solo quiero los parámetros de la URL también estarán automáticamente en $ _GET, así que puedo acceder a ellos fácilmente en componentes de terceros que usan $ _GET de forma nativa.

Editar 2: actualizado como reacción a la respuesta de Samuel Herzog: realmente no me importa invalidar el SRP en este caso, porque las bibliotecas están construidas de tal manera que necesitan acceso directo a $ _GET – hacen su propio filtrado y dependen directamente en este superglobal. También obtienen directamente $ _FILES y $ _POST para procesar, es solo la forma en que funciona su código.

He hecho el siguiente método en el controlador abstracto: $ this-> mergeGet (); que básicamente hace que $ _GET absorba todos los params de ruta coincidente y todo funciona según lo previsto, pero viendo que las bibliotecas serán requeridas en cada controlador / acción, puede resultar tedioso llamar a ese método todo el tiempo. Si solo el controlador tuviera un método init () como en ZF1 …

En primer lugar, no debe usar $_GET o cualquier otro superglobal directamente si está construyendo sobre una stack orientada a objetos. El SRP se invalida de esta manera.

Si no tiene posibilidad de cambiar la forma en que cambian sus bibliotecas (de terceros), es posible que desee enganchar en el evento MvcEvent, escuchar –event– y luego obtener el RouteMatch , puede completar $_GET con un bucle simple .

Para obtener la mejor respuesta, debe saber si la biblioteca nombrada será necesaria para cada acción, solo para un módulo o solo en ciertos controladores / acciones. Si el último es su caso de uso, debe escribir un complemento de controlador en su lugar.

algún código de ejemplo para el primer enfoque:

 namespace YourModule; use Zend\EventManager\EventInterface as Event; use Zend\Mvc\MvcEvent; class Module { ... public function onBootstrap(Event $ev) { $application = $e->getApplication(); $eventManager = $application->getEventManager(); $eventManager->attach('route', function(MvcEvent $mvcEvent) { $params = $mvcEvent->getRouteMatch()->getParams(); foreach ( $params as $name => $value ) { if ( ! isset($_GET[$name]) { $_GET[$name] = $value; } } }); } } 

En ZF2, estoy usando esto

 $getparams = $this->getRequest()->getQuery(); 

Puede usarlo en su controlador de dispositivo:

  $paramValue = $this->params()->fromQuery('your_param_here'); 

Saludos