web-dev-qa-db-ja.com

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

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

97
Matsemann

最も簡単な方法は、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/ にアクセスすると、$ orderBydefault値になりますname

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

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などを使用することもできますが、お勧めできません。

203
Matsemann

たとえば、投稿された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配列を取得しました。お役に立てれば。

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

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を参照してください

コントローラーの外部のインスタンスのプラグインにアクセスできない場合は、このように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');
0
Marcin Żurek