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::Util
にto_ref
とnew
が追加されました。
to_ref
は引数に応じて以下の結果を返します。
- 引数が無い場合は
{}
- リファレンスを渡した場合はそのリファレンス
$_[0]
- ハッシュに見える場合はハッシュリファレンス
{@_}
- ハッシュに見えない場合は配列リファレンス
[@_]
new
は引数をto_ref
したものをbless
して返すコンストラクタです。
これは実際にSlack::App
で使われています。
インターフェースの変更
Slack::Matcher
はSlack::Action
に名前が変更されました
これまではマッチングのためのオブジェクトという役割に過ぎませんでしたが、今後はアクションを表すアクションオブジェクトを意味します。
アクションオブジェクトは自身のタイプを持っています。
type
-
タイプ(
prep
,action
,view
) controller
- コントローラーオブジェクト
name
- アクション名
clause
- 条件節
code
- コード節
インターフェースの削除
アプリケーションの設定appdir
,rootdir
が取り除かれました #8
app->config->{appdir}
とapp->config->{rootdir}
を自動設定する機能が削除されました。
削除された理由は3つあります。
- ビューの機能を外部に委譲するなどして、既にSlack自身は必要としていなかったため。
- ディレクトリ構成はアプリケーションごとに異なるため。
ディレクトリ構成をセオリー通りに固定できるのがフレームワークのメリットだと思うユーザーもいるかもしれません。 しかしセオリーが確立できていないのでその考えは正しくないと言えます。 その証拠に、他のフレームワークを見ても設定などで変更できるものがほとんどでしょう。
結局アプリケーション側で設定することになるのであれば、フレームワーク側で設定する必要はありません。 - 設定は少ない方が良い
『設定より規約』でしょ?:D
なお、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
前後の時点でコアモジュールです。
内部的な変更
app->action
,app->view
が削除されました。