В Zend Framework 1 был очень простой способ разбора URL-маршрутов и установки найденных параметров в суперглобальном $_GET для легкого доступа. Конечно, вы могли бы использовать ->getParam ($something )внутри контроллера, но если параметр был найден в URL-адресе, он также был доступен через $ _GET.
Пример для URLmypage.com/mymodule/mycontroller/myaction/someparam/5:
ЗФ1
$this->getParam('someparam'); // 5
$_GET['someparam']; // 5
ZF2
$this->getEvent()->getRouteMatch()->getParam('someparam'); // 5
$_GET['someparam'] // undefined index someparam
Очевидно, разница в том, что ZF2 НЕ помещает параметры маршрута в суперглобальную $_GET.
Как мне заставить его поместить проанализированные параметры в суперглобальную $_GET, поскольку расширение контроллера и просто определение конструктора, который делает это, не может быть и речи (, потому что RouteMatch еще не является объектом и не может быть вызван из конструктор контроллера )?
Вызов $_GET = $this->getEvent()->getRouteMatch()->getParam('someparam');
в каждом из моих контроллеров сработает, но я этого не хочу.
Другими словами, следуя приведенному выше примеру URL-адреса, я хочу иметь возможность выполнить $_GET['someparam'] и при этом получить значение «5» в любом компоненте приложения.
Изменить :Похоже, я недостаточно ясно выразился, поэтому я попытаюсь уточнить еще кое-что. Я хочу, чтобы любой параметр, который я ввожу в URL-адресе через формирование /key/value, был доступен в $ _GET мгновенно.У меня нет проблем с получением параметра, я знаю, как его получить, и я расширил контроллер Zend, так что я могу просто снова вызвать $this ->getParams, как в ZF1, и теперь все контроллеры расширяют его, я просто хочу, чтобы параметры из URL-адреса также автоматически находились в $ _GET, чтобы я мог легко получить к ним доступ в сторонних компонентах, которые изначально используют $ _GET.
Редактировать 2 :Обновлено как реакция на ответ Самуэля Херцога :Я не очень против инвалидации SRP в данном случае, потому что библиотеки построены таким образом, что им нужен прямой доступ к $_GET-они делают свою фильтрацию и напрямую зависят от этого суперглобала. Они также напрямую извлекают $_FILES и $_POST для обработки, просто так работает их код.
Я сделал следующий метод в абстрактном контроллере :$this ->mergeGet (); что в основном заставляет $ _GET поглощать все параметры сопоставления маршрута, и все работает так, как задумано, но, поскольку библиотеки потребуются в каждом контроллере/действии, может быть утомительно вызывать этот метод каждый раз. Если бы в контроллере был метод инициализации ()как в ZF1...