zendframework/zend-mvc ~2.7|3.0 でのpsr/http-message の利用

PHPプロジェクトスケルトンの一つzendframework/ZendSkeletonApplicationでのベース部分であるzendframework/zend-mvc では、ヴァージョン 2.7(2016/5リリース) あるいは 3.0 (2016/06リリース) にてもとからあったcontroller&actionを実行するDispatchListenerとは別にMiddlewareListenerが追加されました。

これは、psr/http-message (psr-7) に対応した "ミドルウェア"を(ほぼ旧来のアクションと見なさせるもの)実行可能にするものです。zend-httpからzend-diactorosへは、zend-psr7bridgeにて変換を行っています。

設定ファイルconfig/module.config.php でのルーティング部分でいうと、

  'defaults' => [
//      'controller' => Controller\IndexController::class,
//      'action'     => 'index',
      'middleware' => 'IndexMiddleware'
  ],

のみでの変更にて"ミドルウェア"として呼び出しができます。

またミドルウェアのサービス定義も以下のような定義をconfig/module.config.phpなりで用意できます。

    'service_manager' => [
        'factories' => [
            'IndexMiddleware' => function (ContainerInterface $container) {
                $filters = $container->get('InputFilterManager');
                $inputFilter = $filters->get('foobar');
                return new class ($inputFilter) {

                    /**
                     * @var \Zend\InputFilter\InputFilterInterface
                     */
                    private $inputFilter;

                    public function __construct(InputFilterInterface $inputFilter)
                    {
                        $this->inputFilter = $inputFilter;
                    }

                    public function __invoke(ServerRequestInterface $req, ResponseInterface $res, callable $next = null)
                    {
                        // do some stuff
                        return $res; // returnは必要
                    }
                };
            }
        ]
    ],

zend-mvcでのドキュメントも参照ください。

Middleware利用での効能

zend-httpからzend-diactorosへの変換コストがかかりますが、ルーティングの一部分で"ミドルウェア"のものへと移行でき、依存はpsr-7でのインターフェイスのみとなります。ほかのディスパッチ機構(zend-expressive/zend-stratigilityやslimphp3など)への移行を念頭において"アクション"が作成できます。

zend-mvc と zend-expressive との関係はどうとらえればいいの?

現行のzend-mvcはzf2にて導入され、EventMangaerでのイベントとModuleManagerによるモジュールをつなぎ合わせるものでしたが、"マイクロフレームワーク"zend-expressiveとの関係をきになるかたもいるでしょう。その点について、リードデヴェロッパーのweierophinneyを含めた開発者の意見が下記githubにて交わされてるので確認いただければと思います。

なお先日のZendConで「Building middleware applications with Zend Framework 3」という発表があったようなのですが、スライドの中身はひたすらexpressiveについてでした。。