Как получить доступ к параметрам маршрута, публикации, получения и т. Д. В Zend Framework 2

98

Как я могу получить различные параметры, связанные с запросом страницы в zf2? Как и параметры post / get, доступ к маршруту, отправленные заголовки и загруженные файлы.

Мацеманн
источник

Ответы:

205

Самый простой способ сделать это - использовать плагин Params , представленный в beta5. В нем есть служебные методы, упрощающие доступ к различным типам параметров. Как всегда, чтение тестов может оказаться полезным для понимания того, как что-то предполагается использовать.

Получите одно значение

Чтобы получить значение именованного параметра в контроллере, вам нужно будет выбрать соответствующий метод для типа параметра, который вы ищете, и передать имя.

Примеры:

$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 и т. Д., Но это не рекомендуется.

Мацеманн
источник
4
Также возможен вызов плагина params напрямую, это ярлык для fromRoute ():$this->params('key', 'default')
Робин,
@Robin, это правда. Обратите внимание, что вы не можете использовать его для получения всех параметров маршрута, потому что его вызов без параметров вернет плагин Params, а не данные маршрута.
Мацеманн,
1
+1 за комментарий + ссылка на юнит-тесты. Мало кто почему-то думает проверить юнит-тесты.
Xunnamius
4

Например, самый простой способ получить опубликованную строку 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. Надеюсь это поможет.

Susy11
источник
1
Если вам нужно исходное тело POST, используйте getContent () объекта запроса. С диспетчера вы могли бы сделать:$content = $this->getRequest()->getContent()
Торин Финнеманн 08
В ZF2 как мы можем получить параметр URL в форме ?name=mike?
Стефан
1
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;
Анкит Вишвакарма
источник
0

Все вышеперечисленные методы будут работать нормально, если ваш тип контента - «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

Лакшми Рамакришнан
источник
0

Если у вас нет доступа к плагину, например, вне контроллера, вы можете получить параметры из 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');
Марцин Журек
источник