Відповіді:
Найпростіший спосіб зробити це - використовувати плагін 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, ви побачите, що це лише тонка обгортка навколо інших контролерів, щоб забезпечити більш послідовне пошук параметрів. Якщо ви з якоїсь причини хочете / потребуєте доступу до них безпосередньо, ви можете побачити у вихідному коді, як це робиться.
$this->getRequest()->getRequest('name', 'default');
$this->getEvent()->getRouteMatch()->getParam('name', 'default');
ПРИМІТКА. Ви могли б використовувати суперглобали $ _GET, $ _POST тощо, але це не перешкоджає.
Наприклад, найпростіший спосіб отримати розміщений рядок 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',
),
),
),
і я хотів розмістити дані за допомогою $ http.post Angular. Повідомлення було чудово, але метод вилучення в Зенді
$this->params()->fromPost('paramname');
в цьому випадку нічого не отримали. Тож моє рішення було, спробувавши всі види таких методів, як $ _POST та інші способи, зазначені вище, читати з 'php: //':
$content = file_get_contents('php://input');
print_r(json_decode($content));
Зрештою, я отримав свій json масив. Сподіваюся, це допомагає.
$content = $this->getRequest()->getContent()
?name=mike
?
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;
Усі перераховані вище методи працюватимуть нормально, якщо ваш тип вмісту "application / -www-form-urlencoded". Але якщо ваш тип вмісту - це "application / json", вам доведеться зробити наступне:
$ params = json_decode (file_get_contents ('php: // input'), true); print_r ($ парами);
Причина: Дивіться № 7 в https://www.toptal.com/php/10-most-common-mistakes-php-programmers-make
Якщо у вас немає доступу до плагіна, наприклад, поза контролером, ви можете отримати парами від сервісного диспетчера
//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');
$this->params('key', 'default')