MTでは5.2.4からレジストリを使ってPSGIミドルウェアを各アプリケーションに適用できるようになっているので、この仕組を使ってMTを拡張する方法をいくつか考えてみました。(検証したのはMT6 Beta1です)
公式ドキュメント
PSGIミドルウェアとは
PSGIミドルウェアとは、PSGIアプリケーションに対してリクエスト時の環境やレスポンスを動的に書き換えるための仕組みです。PSGIミドルウェアを使うことでレスポンスのHTMLを書き換えたり、認証のレイヤーを別に挟んだりということができます。MTはプラグインによる拡張の方法が充実しているので、機能の拡張としてはそれで事足りる部分も多いですが、
- PSGIミドルウェアの資産(MTに限らない)を利用することができる
- 拡張するためにMTの知識を必要としない
という点がPSGIミドルウェアを利用するメリットであると思います。
逆にMTでPSGIミドルウェアを使う場合にあらかじめ考慮しておくべきところとしては、
- そもそもPSGIアプリケーションとして実行していないと(CGIで実行している)と利用できない。
という点があります。
以下、ミドルウェアの適用例をいくつか紹介していきます。
MTのアカウント情報を使ってBASIC認証を設定
PlackにはPlack::Middleware::Auth::Basicというミドルウェアが同梱されていて、これを使うと簡単にBASIC認証を設定することができます。以下のような config.yaml でプラグインを作成すると、
- mt-search.cgi
- mt-data-api.cgi
に対してBASIC認証が必要になり、MTアカウントの「ユーザー名」と「APIパスワード」が送られてきた場合にだけ結果を得ることができるようになります。
「options」にサブルーチンを渡すパターンとしては「code」と「handler」があり、この違いが少しややこしいですが、
- code: 初期化時に一度だけ実行され、サブルーチンから返された値がミドルウェアに渡される
- handler: コードのリファレンスがミドルウェアに渡される
という違いがあります。
プラグイン: P-M-Auth-Basic
デバッグ情報を表示
開発時に有用なミドルウェアもたくさん公開されており、Plack::Middleware::DebugRequestParamsはその一つです。以下のような config.yaml でプラグインを作成すると、環境変数のDebugModeが有効である場合に、リクエストパラメータの一覧が標準エラー出力(多くの場合にはstarmanを実行した端末)に表示されるようになります。
「condition」はPlack::Builder::add_middleware_ifに渡され、リクエストの度に評価されます。
ライセンス的に問題のないミドルウェアであればプラグインのextlibに同梱することもできるので(他のプラグインとのバージョンのコンフリクトは気にする必要はありますが)、配布する場合にはexlibに同梱してしまうのもMTらしい形だと思います。
プラグイン: P-M-DebugRequestParams
mt-search.cgiの検索条件にエイリアスを設定
PSGIミドルウェアを使えることの最大のメリットは既存のPSGIの資産を利用できることだと思いますが、専用のPSGIを新しく書くことも簡単です。例えば以下のようなコードを書くと、mt-search.cgiの検索条件へのエイリアスを作成することができます。
config.yamlを以下のように書き、
mt-config.cgiで以下のように設定すれば、
http://host/mt/search/food
で、
http://host/mt/mt-search.cgi?search=food&IncludeBlogs=1&limit=20
にアクセスしたのと同じ結果が得られるようになります。
プラグイン: P-M-AliasedSearch
サーバーのステータスを取得
PSGIミドルェアの中に、Plack::Middleware::ServerStatus::Liteというサーバーのステータスを取得するものがあります。以下のような config.yaml でプラグインを作成するとServerStatus::Lite を適用することができるのですが、mt.cgi/server-status のようなURLになってしまうので、これはあまりいい感じではありません。
PSGIサーバー全体に適用するような場合には「サクッとPSGIなMTOSの開発環境を用意する方法」でも紹介されているような、専用の.psgiファイルを作成して起動する方がいいと思います。
その他
その他、MTと一緒に利用できそうなプラグインをいくつか紹介します。
- Plack::Middleware::JSONP
- JSON形式で返されるレスポンスを、JSONPで呼び出せるように変換します。
- DataAPIからのレスポンスに適用することができそうです。
- Plack::Middleware::Deflater
- レスポンスデータをGzipやDeflate圧縮します。
コメント