Zugriff auf Routen-, Post-, Get- usw. Parameter in Zend Framework 2

98

Wie kann ich verschiedene Parameter für die Seitenanforderung in zf2 abrufen? Wie Post / Get-Parameter, die Route, auf die zugegriffen wird, Header gesendet und Dateien hochgeladen.

Matsemann
quelle

Antworten:

205

Der einfachste Weg, dies zu tun, wäre die Verwendung des in Beta5 eingeführten Params-Plugins . Es verfügt über Dienstprogrammmethoden, die den Zugriff auf verschiedene Arten von Parametern erleichtern. Wie immer kann sich das Lesen der Tests als wertvoll erweisen, um zu verstehen, wie etwas verwendet werden soll.

Holen Sie sich einen einzelnen Wert

Um den Wert eines benannten Parameters in einem Controller zu erhalten, müssen Sie die entsprechende Methode für den gesuchten Parametertyp auswählen und den Namen übergeben.

Beispiele:

$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

 

Standardwerte

Alle diese Methoden unterstützen auch Standardwerte, die zurückgegeben werden, wenn kein Parameter mit dem angegebenen Namen gefunden wird.

Beispiel:

$orderBy = $this->params()->fromQuery('orderby', 'name');

Beim Besuch von http://example.com/?orderby=birthdate hat $ orderBy den Wert Geburtsdatum .
Bei einem Besuch in http://example.com/ , $ orderBy die haben Standardwert Namen .
 

Holen Sie sich alle Parameter

Um alle Parameter eines Typs zu erhalten, übergeben Sie einfach nichts und das Params-Plugin gibt ein Array von Werten mit ihren Namen als Schlüssel zurück.

Beispiel:

$allGetValues = $this->params()->fromQuery(); // empty method call

Beim Besuch von http://example.com/?orderby=birthdate&filter=hasphone $ allGetValues wird ein Array wie

array(
    'orderby' => 'birthdate',
    'filter'  => 'hasphone',
);

 

Params Plugin nicht verwenden

Wenn Sie den Quellcode überprüfen für das Params-Plugin überprüfen, werden Sie feststellen, dass es sich nur um einen dünnen Wrapper um andere Controller handelt, um ein konsistenteres Abrufen von Parametern zu ermöglichen. Wenn Sie aus irgendeinem Grund direkt darauf zugreifen möchten / müssen, können Sie im Quellcode sehen, wie es gemacht wird.

Beispiel:

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

HINWEIS: Sie hätten die Superglobalen $ _GET, $ _POST usw. verwenden können, aber davon wird abgeraten.

Matsemann
quelle
4
Das direkte Aufrufen des Params-Plugins ist ebenfalls möglich. Es ist eine Verknüpfung zu fromRoute ():$this->params('key', 'default')
Robin
@ Robin das ist wahr. Beachten Sie, dass Sie damit nicht alle Routenparameter abrufen können, da beim Aufrufen ohne Parameter das Params-Plug-In zurückgegeben wird und keine Routen.
Matsemann
1
+1 für den Unit Test Test Kommentar + Link. Nur wenige denken aus irgendeinem Grund daran, die Unit-Tests zu überprüfen.
Xunnamius
4

Der einfachste Weg, einen geposteten JSON-String zu erhalten, besteht beispielsweise darin, den Inhalt von 'php: // input' zu lesen und ihn dann zu dekodieren. Zum Beispiel hatte ich eine einfache Zend-Route:

'save-json' => array(
'type' => 'Zend\Mvc\Router\Http\Segment',
            'options' => array(
                'route'    => '/save-json/',
                'defaults' => array(
                    'controller' => 'CDB\Controller\Index',
                    'action'     => 'save-json',
                ),
            ),
        ),

und ich wollte Daten mit Angulars $ http.post darauf posten. Die Post war in Ordnung, aber die Retrive-Methode in Zend

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

habe in diesem Fall nichts bekommen. Meine Lösung bestand also darin, nachdem ich alle Arten von Methoden wie $ _POST und die anderen oben genannten Methoden ausprobiert hatte, aus 'php: //' zu lesen:

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

Am Ende habe ich mein JSON-Array bekommen. Hoffe das hilft.

Susy11
quelle
1
Wenn Sie den rohen POST-Body benötigen, verwenden Sie getContent () des Anforderungsobjekts. Von einem Controller aus können Sie Folgendes tun:$content = $this->getRequest()->getContent()
Torin Finnemann,
Wie können wir auf ZF2 einen URL-Parameter in Form von abrufen ?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
quelle
0

Alle oben genannten Methoden funktionieren einwandfrei, wenn Ihr Inhaltstyp "application / -www-form-urlencoded" ist. Wenn Ihr Inhaltstyp jedoch "application / json" ist, müssen Sie Folgendes tun:

$ params = json_decode (file_get_contents ('php: // input'), true); print_r ($ params);

Grund: Siehe Nr. 7 unter https://www.toptal.com/php/10-most-common-mistakes-php-programmers-make

Lakshmi Ramakrishnan
quelle
0

Wenn Sie beispielsweise außerhalb des Controllers keinen Zugriff auf das Plugin haben, können Sie Parameter wie folgt von servicelocator abrufen

//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
quelle