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についてでした。。