Получение $ 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;
}
}
});
}
}
вы можете использовать в своем controlller:
$paramValue = $this->params()->fromQuery('your_param_here');
в отношении