Zf2でページリクエストに関連するさまざまなパラメーターを取得するにはどうすればよいですか? post/getパラメーター、アクセスされるルート、送信されたヘッダー、アップロードされたファイルなど。
最も簡単な方法は、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はdefault値になりますname。
1つのタイプのすべてのパラメーターを取得するには、何も渡さないでください。Paramsプラグインは、名前をキーとして値の配列を返します。
$allGetValues = $this->params()->fromQuery(); // empty method call
http://example.com/?orderby=birthdate&filter=hasphone$ allGetValuesは次のような配列になります
array(
'orderby' => 'birthdate',
'filter' => 'hasphone',
);
Paramsプラグインの ソースコード を確認すると、それは他のコントローラーの単なる薄いラッパーであり、より一貫したパラメーターの取得を可能にしていることがわかります。何らかの理由で直接アクセスしたい場合は、ソースコードでどのように実行されているかを確認できます。
$this->getRequest()->getRequest('name', 'default');
$this->getEvent()->getRouteMatch()->getParam('name', 'default');
注:スーパーグローバル$ _GET、$ _ POSTなどを使用することもできますが、お勧めできません。
たとえば、投稿された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配列を取得しました。お役に立てれば。
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;
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');