Получение $ GET параметров из маршрута в Zend Framework 2

Zend Framework 1 имел очень простой способ разбора URL-маршрутов и установки найденных параметров в $_GET superglobal для легкого доступа. Конечно, вы можете использовать ->getParam($something) внутри контроллера, но если param был найден в URL-адресе, это было и доступно через $_GET.

пример 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

очевидно, разница в том, что ZF2 не помещает параметры маршрута в Параметр $_GET суперглобальные.

как заставить его поместить проанализированные параметры в $ _GET superglobal, так как расширение контроллера и просто определение конструктора, который делает это, не может быть и речи (потому что RouteMatch еще не является объектом и не может быть вызван из конструктора контроллера)?

вызов $_GET = $this->getEvent()->getRouteMatch()->getParam('someparam'); в каждой из моих контроллеров будет работать, но я этого не хочу.

другими словами, следуя примеру URL сверху, я хочу иметь возможность сделайте $_GET ['someparam'] и все равно получите значение "5" в любом компоненте приложения.

Edit: похоже, я был недостаточно ясен, поэтому я попытаюсь прояснить еще кое-что. Я хочу, чтобы любой параметр, который я ввожу в URL через/key / value formation, был доступен в $_GET мгновенно. У меня действительно нет проблем с получением param, я знаю, как его получить, и я расширил контроллер Zend, поэтому я могу просто вызвать $this - >getParams снова, как в ZF1, и теперь все контроллеры расширяют этот, я просто хочу параметры из URL-адреса автоматически находятся в $_GET, поэтому я могу легко получить к ним доступ в сторонних компонентах, которые используют $_GET изначально.

Edit 2: Обновлено как реакция на ответ Сэмюэля Херцога: Я не против отмены СРП в данном случае, поскольку библиотеки построены таким образом, что им нужен прямой доступ к $_GET - они делают свои собственные фильтрации и напрямую зависят от этой суперглобальной переменной. Они также напрямую получают $_FILES и $_POST для обработки, это просто как работает их код.

Я сделал следующий метод в абстрактном контроллере: $this - >mergeGet (); что в основном заставляет $_GET поглощать все сопоставленные параметры маршрута, и все работает по назначению, но, поскольку библиотеки потребуются в каждом контроллере/действии, может быть утомительно вызывать этот метод каждый раз. Если бы только контроллер имел метод init (), как в ZF1...

3 ответов


прежде всего, вы не должны использовать $_GET или любой другой суперглобальный непосредственно, если вы строите на объектно-ориентированном стеке. Таким образом, SRP недействителен.

если у вас нет возможности изменить способ вашего (3rd party?) библиотеки для изменения вы можете подключиться к MvcEvent, прослушать -- event--, а затем получить RouteMatch, вы можете заполнить $_GET С простым циклом.

для наиболее эффективного ответа вы должны знать, понадобится ли именованная библиотека для каждого действия, только для одного модуля или только в определенных контроллерах/действиях. Если последним является ваш вариант использования, вы должны написать плагин контроллера вместо этого.

какой-то пример кода для первого подхода:

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;
                }
            }
        });
    }
}

в ZF2, я использую это

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

вы можете использовать в своем controlller:

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

в отношении