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


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.


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.


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;


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');
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.