Как я могу получить различные параметры, связанные с запросом страницы в zf2? Как параметры отправки/получения, доступ к маршруту, отправленные заголовки и загруженные файлы.
Как получить доступ к параметрам маршрута, сообщения, получения и т.д. В Zend Framework 2
Ответ 1
Самый простой способ сделать это - использовать Params plugin, представленный в бета5. Он имеет полезные методы, облегчающие доступ к различным типам параметров. Как всегда, чтение тестов может оказаться полезным для понимания того, как что-то предполагается использовать.
Получить одно значение
Чтобы получить значение именованного параметра в контроллере, вам необходимо выбрать соответствующий метод для типа параметра, который вы ищете, и передать имя.
Примеры:
$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
Значения по умолчанию
Все эти методы также поддерживают значения по умолчанию, которые будут возвращены, если не будет найден параметр с заданным именем.
Пример:
$orderBy = $this->params()->fromQuery('orderby', 'name');
При посещении http://example.com/?orderby=birthdate,
$ orderBy будет иметь значение дата рождения.
При посещении http://example.com/,
$ orderBy будет иметь значение по умолчанию имя.
Получить все параметры
Чтобы получить все параметры одного типа, просто ничего не передавайте, и плагин Params вернет массив значений с их именами в качестве ключей.
Пример:
$allGetValues = $this->params()->fromQuery(); // empty method call
При посещении http://example.com/?orderby=birthdate&filter=hasphone $allGetValues будет массивом типа
array(
'orderby' => 'birthdate',
'filter' => 'hasphone',
);
Не использовать плагин Params
Если вы проверите исходный код для плагина Params, вы увидите, что это просто тонкая оболочка вокруг других контроллеров, чтобы обеспечить более последовательную поиск параметров. Если вы по какой-либо причине хотите/должны получить к ним доступ напрямую, вы можете увидеть в исходном коде, как это делается.
Пример:
$this->getRequest()->getRequest('name', 'default');
$this->getEvent()->getRouteMatch()->getParam('name', 'default');
ПРИМЕЧАНИЕ.. Вы могли бы использовать суперглобалы $_GET, $_POST и т.д., но это не рекомендуется.
Ответ 2
Самый простой способ получить опубликованную строку json, например, - это прочитать содержимое "php://input", а затем декодировать его. Например, у меня был простой маршрут Zend:
'save-json' => array(
'type' => 'Zend\Mvc\Router\Http\Segment',
'options' => array(
'route' => '/save-json/',
'defaults' => array(
'controller' => 'CDB\Controller\Index',
'action' => 'save-json',
),
),
),
и я захотел опубликовать данные, используя Angular $http.post. Сообщение было прекрасным, но метод извлечения в Zend
$this->params()->fromPost('paramname');
ничего не получилось в этом случае. Таким образом, мое решение состояло в том, что, пробовав всевозможные методы, такие как $_POST и другие методы, указанные выше, читайте из "php://":
$content = file_get_contents('php://input');
print_r(json_decode($content));
В конце концов, я получил массив json. Надеюсь, это поможет.
Ответ 3
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;
Ответ 4
Если у вас нет доступа к плагину, например, за пределами контроллера, вы можете получить параметры из servicelocator, как это
//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');
Ответ 5
Все вышеперечисленные методы будут работать нормально, если ваш тип контента "application / -www-form-urlencoded". Но если ваш тип контента "application/json", вам придется сделать следующее:
$ params = json_decode (file_get_contents ('php://input'), true); print_r ($ PARAMS);
Причина: см. № 7 в https://www.toptal.com/php/10-most-common-mistakes-php-programmers-make