Як отримати доступ до параметрів маршруту, публікації, отримання тощо в Zend Framework 2


98

Як я можу отримати різні параметри, пов'язані із запитом на сторінку в zf2? Як і параметри публікації / отримання, маршрут, до якого звертаються, надсилаються заголовки та завантажуються файли.

Відповіді:


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
Зателефонувати безпосередньо в плагін для параменів, це також є ярликом до маршрутуRoute ():$this->params('key', 'default')
Робін

@Robin це правда. Зауважте, що ви не можете використовувати його для отримання всіх параметрів маршруту, оскільки виклик його без параметрів поверне модуль Params, а не матеріал маршруту.
Matsemann

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',
                ),
            ),
        ),

і я хотів розмістити дані за допомогою $ http.post Angular. Повідомлення було чудово, але метод вилучення в Зенді

$this->params()->fromPost('paramname'); 

в цьому випадку нічого не отримали. Тож моє рішення було, спробувавши всі види таких методів, як $ _POST та інші способи, зазначені вище, читати з 'php: //':

$content = file_get_contents('php://input');
print_r(json_decode($content));

Зрештою, я отримав свій json масив. Сподіваюся, це допомагає.


1
Якщо вам потрібен необроблений корпус POST, використовуйте getContent () об'єкта запиту. З контролера ви могли зробити:$content = $this->getRequest()->getContent()
Torin Finnemann

Як на 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 ($ парами);

Причина: Дивіться № 7 в https://www.toptal.com/php/10-most-common-mistakes-php-programmers-make


0

Якщо у вас немає доступу до плагіна, наприклад, поза контролером, ви можете отримати парами від сервісного диспетчера

//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');
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.