記事

Last Modified:

Release Slack-v0.6.0 #Perl #Slack

この文書は以前のバージョンv0.5.0とv0.6.0の変更点を記述しています。

このリリースには以前のバージョンと互換性の無い変更が含まれています。

インターフェースの追加

パターンは条件節にアップグレードされました

パターンは条件節にアップグレードされました。 これによって、Slackはより強力に柔軟にアクションのマッチ条件を記述できるようになりました。

条件節は、環境変数名と正規表現の対で定義されたハッシュリファレンスです。 条件節に指定された各条件は環境変数req->envの同名の変数とそれぞれマッチングされ、全てを満たしたアクションがマッチしたとみなされます。

これまでの文字列指定や正規表現指定は単なるシンタックスシュガーとなりました。

具体例はt/advanced-routing.tを参照してください。

事前処理を行なうためのアクションprepが追加されました

事前処理を行なうためのアクションが追加され、キーワードprepで定義できるようになりました。

prepの構文はaction,viewと全く同じですが、マッチしたアクションを全て実行します。

また探索順序はaction,viewの深さ優先探索とは逆に、ルートコントローラーからの幅優先探索になります。 Catalystのautoのイメージで間違っていません。

具体例はt/advanced-routing.tを参照してください。

アプリケーションにコントローラーを継承できるようになりました

use Slack qw(App Controller)とすることで、アプリケーションでありコントローラーでもあるクラスを作成できるようになりました。

この場合prefixは/となるため、いわゆるルートコントローラーをとても自然に記述できるようになりました。 もはやルートコントローラーのためのsub prefix { '/' }は不要です。

# --- MyApp.pm ---
package MyApp;
use Slack qw(App Controller);

# sub prefix { '/' }

# --- MyApp/Foo.pm ---
package MyApp::Foo;
use Slack qw(Controller);

# sub prefix { '/foo/' }

HTTP_NOT_IMPLEMENTEDの対応が追加されました

どのアクションでも定義されていないRequestMethodに対してHTTP_NOT_IMPLEMENTEDが返されるようになりました。

マッチしたアクションだけに定義されていないRequestMethodに対しては、これまで通りHTTP_METHOD_NOT_ALLOWEDが返されます。

コンストラクタの記述に便利なユーティリティ関数が追加されました

Slack::Utilto_refnewが追加されました。

to_refは引数に応じて以下の結果を返します。

newは引数をto_refしたものをblessして返すコンストラクタです。 これは実際にSlack::Appで使われています。

インターフェースの変更

Slack::MatcherSlack::Actionに名前が変更されました

これまではマッチングのためのオブジェクトという役割に過ぎませんでしたが、今後はアクションを表すアクションオブジェクトを意味します。

アクションオブジェクトは自身のタイプを持っています。

type
タイプ(prep,action,view
controller
コントローラーオブジェクト
name
アクション名
clause
条件節
code
コード節

インターフェースの削除

アプリケーションの設定appdir,rootdirが取り除かれました #8

app->config->{appdir}app->config->{rootdir}を自動設定する機能が削除されました。

削除された理由は3つあります。

なお、app->configアクセサはまだ削除はされていませんが非推奨となりました。次のリリースで削除される予定です。 アプリケーションに設定を持たせたいのであれば、ユーザーが自分でアプリケーションクラスにconfigアクセサを実装できます。

c->viewが削除されました

c->viewは不要になったため削除されました。

実装の変更

アクションの優先度が簡略化されました

優先順位は、まずアクションが属するコントローラーのprefix階層の深さによって決定されます。 prepは浅い方が、action,viewは深い方が優先されることに注意してください。

prefix階層の深さが同じ場合は、先に記述された(=先にパースされた)アクションが優先されます。 モジュールを読み込む順番によって結果が変わる可能性があるため、同じリクエストにマッチするアクションを別のパッケージに記述する場合は十分注意してください。

以前のバージョンでは、パターンの型によっても優先順位に影響がありました。 これはCatalystを参考にした結果ですが、複雑過ぎて混乱を招いていたため廃止されました。

actionは拡張子に関わらずマッチするようになりました

アクションとビューは独立しているべきであるため、actionはリクエストの拡張子を無視してマッチするようになりました。

ただし、アプリケーションで定義されていない拡張子は無視されません。 内部的には、すべての条件節で指定された拡張子をPATH_INFOから除外したものに対して、actionのマッチングを行なっています。

以前のバージョンではマッチしたビューに指定されている拡張子のみをPATH_INFOから除外してマッチングを行なっていました。 そのため、マッチするビューが無い場合は一切アクションが呼ばれませんでした。

{ extension => ... }は非推奨となりました

条件節に環境変数を指定できるようになったため、なるべく環境変数名と混同しないためにextensionは廃止されます。

代わりに{ '.' => ... }を使ってください。extensionによる指定は次のリリースで削除される予定です。

Time::Pieceに依存しなくなりました

SlackはもはやTime::Pieceを必要としません。 というより、これまでずっと不要だったのにuseしていました。

コントローラーは状態変数を持たなくなりました

コントローラーは状態変数を持たなくなりました。

これに伴いnewもされなくなりましたが、問題があった場合は将来的に変更されます。

cpanfileが追加されました #6

cpanfileが追加されました。

依存関係が多いように見えるかもしれませんが、ほとんどがperl-v5.16前後の時点でコアモジュールです。

内部的な変更