web-dev-qa-db-de.com

Zugriff auf Parameter für Routen, Posten, Abrufen usw. in Zend Framework 2

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

94
Matsemann

Der einfachste Weg wäre, das in beta5 eingeführte Params plugin zu verwenden. Es verfügt über Hilfsmethoden, um den Zugriff auf verschiedene Arten von Parametern zu erleichtern. Lesen von den Tests kann wie immer wertvoll sein, um zu verstehen, wie etwas verwendet werden soll.

Holen Sie sich einen einzelnen Wert

Um den Wert eines benannten Parameters in einer Steuerung abzurufen, müssen Sie die geeignete 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.
Beim Besuch von http://example.com/ , $ orderBy erhält den Standardwert Wert Name.

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 ähnlich

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

Params Plugin nicht verwenden

Wenn Sie den source code für das Params-Plugin überprüfen, werden Sie feststellen, dass es sich nur um einen dünnen Wrapper um andere Controller handelt, um einen konsistenteren Parameterabruf zu ermöglichen. Wenn Sie aus irgendeinem Grund direkt auf sie zugreifen möchten/müssen, können Sie im Quellcode nachsehen, wie dies geschieht.

Beispiel:

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

HINWEIS: Sie könnten die Superglobalen $ _GET, $ _POST usw. verwendet haben, aber das wird entmutigt.

199
Matsemann

Der einfachste Weg, einen geposteten Json-String zu erhalten, besteht beispielsweise darin, den Inhalt von 'php: // input' zu lesen und ihn dann zu decodieren. 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 posten. Der Beitrag war gut, aber die Wiederherstellungsmethode in Zend 

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

habe in diesem Fall nichts bekommen. Meine Lösung war also, nachdem ich alle möglichen 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));

Ich habe am Ende mein Json Array bekommen. Hoffe das hilft.

4
Susy11
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;
1

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 # 7 in https://www.toptal.com/php/10-most-common-mistakes-php-programmers-make

Wenn Sie keinen Zugriff auf das Plugin haben, z. B. außerhalb des Controllers, können Sie wie folgt Parameter vom Servelocator erhalten

//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');
0
Marcin Żurek