Jak uzyskać dostęp do parametrów route, post, get itp. W Zend Framework 2

98

Jak mogę uzyskać różne parametry związane z żądaniem strony w zf2? Podobnie jak parametry post / get, uzyskiwana trasa, wysyłane nagłówki i przesyłane pliki.

Matsemann
źródło

Odpowiedzi:

205

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.

Uzyskaj jedną wartość

Aby uzyskać wartość nazwanego parametru w kontrolerze, musisz wybrać odpowiednią metodę dla typu szukanego parametru i przekazać nazwę.

Przykłady:

$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

 

Wartości domyślne

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.

Przykład:

$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 .
 

Uzyskaj wszystkie parametry

Aby uzyskać wszystkie parametry jednego typu, po prostu niczego nie przekazuj, a wtyczka Params zwróci tablicę wartości z ich nazwami jako kluczami.

Przykład:

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

 

Nie używa wtyczki Params

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.

Przykład:

$this->getRequest()->getRequest('name', 'default');
$this->getEvent()->getRouteMatch()->getParam('name', 'default');

UWAGA: Mogłeś użyć superglobali $ _GET, $ _POST itd., Ale jest to odradzane.

Matsemann
źródło
4
Możliwe jest również bezpośrednie wywołanie wtyczki params, jest to skrót do fromRoute ():$this->params('key', 'default')
Robin
@Robin, to prawda. Zauważ, że nie możesz go użyć do pobrania wszystkich parametrów trasy, ponieważ wywołanie go bez parametrów zwróci wtyczkę Params, a nie routing.
Matsemann
1
+1 za komentarz do testów jednostkowych + link. Niewielu myśli o sprawdzeniu testów jednostkowych z jakiegoś powodu.
Xunnamius
4

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.

Susy11
źródło
1
Jeśli potrzebujesz surowej treści POST, użyj metody getContent () obiektu żądania. Za pomocą kontrolera możesz:$content = $this->getRequest()->getContent()
Torin Finnemann
Jak na ZF2 możemy pobrać parametr adresu URL w postaci ?name=mike?
Stephane,
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;
Ankit Vishwakarma
źródło
0

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

Lakshmi Ramakrishnan
źródło
0

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');
Marcin Żurek
źródło