はじめに
お仕事で、Zend Frameworkのバージョンアップをしなければならなくなった・・と思ったら、Zend Frameworkはもうなくて、Laminas Projectに移って新たなフレームワークとして公開されている。
いちから勉強しないといけないじゃん、ということで、必要な要件を満たせるかどうかを一歩ずつ調査していく。
要件(9)
9つ目の要件は、「GETパラメータ、POSTパラメータを取得するラッパーメソッドがあること」。
$_GETや$_POSTなどを直接触りたくないので。
導入
こちらでセットアップした環境を(コピーして)使っていく。
私は以下のようにコピーを作成。
cp -pr laminas-setup-8-user-auth laminas-setup-9-request-parameters cd laminas-setup-9-request-parameters
設定・実装
例示するためのコントローラー、ビューを1つ作っていく。
まず、コントローラーは以下の内容をmodule/Application/src/Controller/RequestParameterController.php
に保存する。
<?php declare(strict_types=1); namespace Application\Controller; use Laminas\Mvc\Controller\AbstractActionController; use Laminas\View\Model\ViewModel; class RequestParameterController extends AbstractActionController { public function indexAction() { return new ViewModel([]); } public function resultAction() { $getParams = $this->getRequest()->getQuery(); $postParams = $this->getRequest()->getPost(); $files = $this->getRequest()->getFiles(); return new ViewModel([ 'get_params' => $getParams, 'post_params' => $postParams, 'files' => $files, ]); } }
次に、サービスマネージャの設定を追加する。module/Application/config/module.config.php
を以下のように変更する。
<?php declare(strict_types=1); namespace Application; use Laminas\Router\Http\Literal; use Laminas\Router\Http\Segment; use Laminas\ServiceManager\Factory\InvokableFactory; return [ 'router' => [ 'routes' => [ 'home' => [ 'type' => Literal::class, 'options' => [ 'route' => '/', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'index', ], ], ], 'application' => [ 'type' => Segment::class, 'options' => [ 'route' => '/application[/:action]', 'defaults' => [ 'controller' => Controller\IndexController::class, 'action' => 'index', ], ], ], 'forwarded' => [ 'type' => Segment::class, 'options' => [ 'route' => '/forwarded[/:action]', 'defaults' => [ 'controller' => Controller\ForwardedController::class, 'action' => 'index', ], ], ], 'redirected' => [ 'type' => Segment::class, 'options' => [ 'route' => '/redirected[/:action]', 'defaults' => [ 'controller' => Controller\RedirectedController::class, 'action' => 'index', ], ], ], 'tenant' => [ 'type' => Segment::class, 'options' => [ 'route' => '/tenant[/:action]', 'defaults' => [ 'controller' => Controller\TenantController::class, 'action' => 'index', ], ], ], 'session' => [ 'type' => Segment::class, 'options' => [ 'route' => '/session[/:action]', 'defaults' => [ 'controller' => Controller\SessionController::class, 'action' => 'index', ], ], ], 'user-auth' => [ 'type' => Segment::class, 'options' => [ 'route' => '/user-auth[/:action]', 'defaults' => [ 'controller' => Controller\UserAuthController::class, 'action' => 'index', ], ], ], 'request-parameter' => [ 'type' => Segment::class, 'options' => [ 'route' => '/request-parameter[/:action]', 'defaults' => [ 'controller' => Controller\RequestParameterController::class, 'action' => 'index', ], ], ], ], ], 'controllers' => [ 'factories' => [ Controller\IndexController::class => InvokableFactory::class, Controller\ForwardedController::class => InvokableFactory::class, Controller\RedirectedController::class => InvokableFactory::class, Controller\SessionController::class => InvokableFactory::class, Controller\RequestParameterController::class => InvokableFactory::class, ], ], 'view_manager' => [ 'display_not_found_reason' => true, 'display_exceptions' => true, 'doctype' => 'HTML5', 'not_found_template' => 'error/404', 'exception_template' => 'error/index', 'template_map' => [ 'layout/layout' => __DIR__ . '/../view/layout/layout.phtml', 'application/index/index' => __DIR__ . '/../view/application/index/index.tpl', 'application/index/chrome' => __DIR__ . '/../view/application/index/chrome.tpl', 'application/index/firefox' => __DIR__ . '/../view/application/index/firefox.tpl', 'error/404' => __DIR__ . '/../view/error/404.phtml', 'error/index' => __DIR__ . '/../view/error/index.phtml', ], 'template_path_stack' => [ __DIR__ . '/../view', ], 'strategies' => [ 'Smarty\\View\\Strategy', ], ], ];
最後に、ビューテンプレートを2つ作る。
まずmodule/Application/view/application/request-parameter/index.tpl
。
<form action="result?get_a=b&get_c=d&x[]=xx" method="post" enctype="multipart/form-data"> <ul> <li><input type="text" name="post_a" value="B" /></li> <li><input type="text" name="post_c" value="D" /></li> <li><input type="text" name="x[]" value="XX" /></li> <li><input type="file" name="img" /></li> <li><input type="submit" value="Submit" /></li> </ul> </form>
続いてmodule/Application/view/application/request-parameter/result.tpl
。
<table> <thead> <tr> <th>GET parameters</th> <th>POST parameters</th> <th>FILES</th> </tr> </thead> <tbody> <tr> <td> <pre>{$get_params|@var_dump|escape:"html"}</pre> </td> <td> <pre>{$post_params|@var_dump|escape:"html"}</pre> </td> <td> <pre>{$files|@var_dump|escape:"html"}</pre> </td> </tr> </tbody> </table>
動作確認
以下のURLにアクセスする。
http://192.168.56.xxx/laminas-setup-9-request-parameters/public/request-parameter/index
以下のような画面になるはずなので、何か適当なファイルを選んで、Submitボタンを押す。
以下のような画面が出てくればOK。
まとめ
- 今回、すべてのパラメータを取得するにとどめたが、
getQuery('get_a', 'default_a')
、getPost('post_a', 'default_a')
、getFiles('img')
などとすれば特定のパラメータの値の取得がZend FrameworkのgetParam()
のようにできる $\_REQUEST
に対応する値を取得するメソッドはないので、GET
、POST
を明確に分けて取り扱うように注意する必要がある