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が追加されました。
- Release zend-mvc 2.7.0 · zendframework/zend-mvc
- Add a middleware dispatch by ezimuel · Pull Request #32 · zendframework/zend-mvc
これは、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など)への移行を念頭において"アクション"が作成できます。
slimphp 3「これってもしかして…」
— sasezaki (@sasezaki) 25 September 2016
zend-expressive「俺達のインスタンスが…」
「「入れ替わってるー??!!」」
zend-mvc と zend-expressive との関係はどうとらえればいいの?
zf3のサイトはなあ、zend-expressive で作られてるんだよ! ΩΩΩ<ナ、ナンダッテ-!?https://t.co/M1Uz26y37s #細かすぎて伝わらないZF2とZF3の違い選手権
— sasezaki (@sasezaki) 28 June 2016
現行のzend-mvcはzf2にて導入され、EventMangaerでのイベントとModuleManagerによるモジュールをつなぎ合わせるものでしたが、"マイクロフレームワーク"zend-expressiveとの関係をきになるかたもいるでしょう。その点について、リードデヴェロッパーのweierophinneyを含めた開発者の意見が下記githubにて交わされてるので確認いただければと思います。
なお先日のZendConで「Building middleware applications with Zend Framework 3」という発表があったようなのですが、スライドの中身はひたすらexpressiveについてでした。。