Odpowiedzi:
Najłatwiej byłoby to zrobić za pomocą wtyczki Params , wprowadzonej w wersji beta5. Posiada metody narzędziowe ułatwiające dostęp do różnych typów parametrów. Jak zawsze, przeczytanie testów może okazać się przydatne, aby zrozumieć, jak coś powinno być używane.
Aby uzyskać wartość nazwanego parametru w kontrolerze, musisz wybrać odpowiednią metodę dla typu szukanego parametru i przekazać nazwę.
$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
Wszystkie te metody obsługują również wartości domyślne, które zostaną zwrócone, jeśli nie zostanie znaleziony żaden parametr o podanej nazwie.
$orderBy = $this->params()->fromQuery('orderby', 'name');
Odwiedzając http://example.com/?orderby=birthdate ,
$ orderBy będzie mieć wartość birthdate .
Odwiedzając http://example.com/ ,
$ orderBy będzie miało domyślną nazwę wartości .
Aby uzyskać wszystkie parametry jednego typu, po prostu niczego nie przekazuj, a wtyczka Params zwróci tablicę wartości z ich nazwami jako kluczami.
$allGetValues = $this->params()->fromQuery(); // empty method call
Odwiedzając http://example.com/?orderby=birthdate&filter=hasphone $ allGetValues będzie tablicą taką jak
array(
'orderby' => 'birthdate',
'filter' => 'hasphone',
);
Jeśli sprawdzisz kod źródłowy wtyczki Params, zobaczysz, że jest to tylko cienka powłoka wokół innych kontrolerów, aby umożliwić bardziej spójne pobieranie parametrów. Jeśli z jakiegoś powodu chcesz / potrzebujesz uzyskać do nich bezpośredni dostęp, możesz zobaczyć w kodzie źródłowym, jak to się robi.
$this->getRequest()->getRequest('name', 'default');
$this->getEvent()->getRouteMatch()->getParam('name', 'default');
UWAGA: Mogłeś użyć superglobali $ _GET, $ _POST itd., Ale jest to odradzane.
Najłatwiejszym sposobem uzyskania, na przykład, opublikowanego łańcucha json, jest przeczytanie zawartości „php: // input”, a następnie zdekodowanie. Na przykład miałem prostą trasę Zend:
'save-json' => array(
'type' => 'Zend\Mvc\Router\Http\Segment',
'options' => array(
'route' => '/save-json/',
'defaults' => array(
'controller' => 'CDB\Controller\Index',
'action' => 'save-json',
),
),
),
i chciałem wysłać do niego dane za pomocą usługi Angular $ http.post. Post był w porządku, ale metoda pobierania w Zend
$this->params()->fromPost('paramname');
nic nie dostałem w tym przypadku. Moje rozwiązanie polegało na tym, że po wypróbowaniu wszystkich rodzajów metod, takich jak $ _POST i innych metod wymienionych powyżej, odczytałem z „php: //”:
$content = file_get_contents('php://input');
print_r(json_decode($content));
W końcu dostałem moją tablicę json. Mam nadzieję że to pomoże.
$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;
Wszystkie powyższe metody będą działać poprawnie, jeśli typ zawartości to „application / -www-form-urlencoded”. Ale jeśli typ zawartości to „application / json”, będziesz musiał wykonać następujące czynności:
$ params = json_decode (file_get_contents ('php: // input'), true); print_r ($ params);
Powód: zobacz punkt 7 w https://www.toptal.com/php/10-most-common-mistakes-php-programmers-make
Jeśli nie masz dostępu do wtyczki, na przykład poza kontrolerem, możesz pobrać parametry z servicelocator w ten sposób
//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')