Zend Framework 2でroute、post、getなどのパラメーターにアクセスする方法


98

zf2のページリクエストに関連するさまざまなパラメーターを取得するにはどうすればよいですか?post / getパラメータと同様に、アクセスされるルート、送信されるヘッダー、アップロードされるファイル。

回答:


205

これを行う最も簡単な方法は、beta5で導入されたParamsプラグインを使用することです。さまざまなタイプのパラメータに簡単にアクセスできるユーティリティメソッドがあります。いつものように、テストを読むことは、何かがどのように使用されることになっているのかを理解するために貴重であることがわかります。

単一の値を取得する

コントローラで名前付きパラメータの値を取得するには、探しているパラメータのタイプに適したメソッドを選択し、名前を渡す必要があります。

例:

$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

 

デフォルト値

これらのメソッドはすべて、指定された名前のパラメーターが見つからない場合に返されるデフォルト値もサポートしています。

例:

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

訪問したときhttp://example.com/?orderby=birthdateを$ ORDERBYは価値があります誕生日を
訪問したときhttp://example.com/を$ ORDERBYがありますデフォルト値の名前を
 

すべてのパラメーターを取得する

1つのタイプのすべてのパラメーターを取得するには、何も渡さないでください。Paramsプラグインは、名前をキーとして値の配列を返します。

例:

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

訪問するときhttp://example.com/?orderby=birthdate&filter=hasphone $ allGetValuesは、のような配列になります

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

 

Paramsプラグインを使用しない

Paramsプラグインのソースコードを確認すると、他のコントローラーを包む薄いラッパーであり、より一貫したパラメーターの取得が可能です。何らかの理由でそれらに直接アクセスする必要がある場合は、ソースコードでその方法を確認できます。

例:

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

注:スーパーグローバル$ _GET、$ _ POSTなどを使用することもできますが、お勧めしません。


4
直接プラグインのparamsを呼び出すとも可能であり、それはfromRoute(へのショートカット)は次のとおりです。$this->params('key', 'default')
ロビン

本当の@ロビン。パラメータなしで呼び出すと、Paramsプラグインが返され、ルーティングされないため、これを使用してすべてのルートパラメータをフェッチすることはできません。
Matsemann 2012

1
単体テストのコメント+リンクの+1。なんらかの理由で単体テストをチェックしようと考える人はほとんどいません。
Xunnamius 2013年

4

たとえば、投稿されたjson文字列を取得する最も簡単な方法は、「php:// input」の内容を読み取ってからデコードすることです。たとえば、私は単純なZendルートを持っていました:

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

Angularの$ http.postを使用してデータを投稿したかった。投稿は問題ありませんでしたが、Zendの取得メソッド

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

この場合、何も取得されませんでした。したがって、私の解決策は、$ _ POSTや上記の他のメソッドなど、あらゆる種類のメソッドを試した後、「php://」から読み取ることでした。

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

最後に、json配列を取得しました。お役に立てれば。


1
生のPOST本文が必要な場合は、リクエストオブジェクトのgetContent()を使用します。コントローラからは、あなたが行うことができます:$content = $this->getRequest()->getContent()
トゥリンFinnemann

ZF2では、URLパラメータを次の形式で取得するにはどうすればよい?name=mikeですか?
ステファン

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

content-typeが "application / -www-form-urlencoded"の場合、上記のすべてのメソッドが正常に機能します。ただし、コンテンツタイプが「application / json」の場合は、次の操作を行う必要があります。

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

理由:https ://www.toptal.com/php/10-most-common-mistakes-php-programmers-makeの#7を参照してください


0

たとえばコントローラの外でプラグインにアクセスできない場合は、次のようにservicelocatorからパラメータを取得できます

//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');
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.