HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

Zend FrameworkからLaminasに移行する話(9)

はじめに

お仕事で、Zend Frameworkのバージョンアップをしなければならなくなった・・と思ったら、Zend Frameworkはもうなくて、Laminas Projectに移って新たなフレームワークとして公開されている。

いちから勉強しないといけないじゃん、ということで、必要な要件を満たせるかどうかを一歩ずつ調査していく。

要件(9)

9つ目の要件は、「GETパラメータ、POSTパラメータを取得するラッパーメソッドがあること」。

$_GETや$_POSTなどを直接触りたくないので。

導入

こちらでセットアップした環境を(コピーして)使っていく。

hhelibex.hatenablog.jp

私は以下のようにコピーを作成。

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&amp;get_c=d&amp;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ボタンを押す。

laminas-setup-9-request-parameters-1

以下のような画面が出てくればOK。

laminas-setup-9-request-parameters-2

まとめ

  • 今回、すべてのパラメータを取得するにとどめたが、getQuery('get_a', 'default_a')getPost('post_a', 'default_a')getFiles('img')などとすれば特定のパラメータの値の取得がZend FrameworkgetParam()のようにできる
  • $\_REQUESTに対応する値を取得するメソッドはないので、GETPOSTを明確に分けて取り扱うように注意する必要がある