前回に引き続き、
掲示板の概要
今回作成するアプリケーションは、
ここまでのおさらい
前回、
アプリケーションの作成(続き)
ログイン処理
次にログイン処理を作っていきましょう。今回はOpenIDを使用したログイン処理を実装します。
Arkではログイン処理などはプラグインとして用意されています。今回は認証プラグインとセッションプラグインを使用してログイン処理を作成します。
プラグインを使うにはアプリケーションクラス
use_plugins qw{
Session
Session::State::Cookie
Session::Store::Memory
Authentication
Authentication::Credential::OpenID
Authentication::Store::Null
};
これでセッションと認証のプラグインをロードできます。ロードしたプラグインを見てみましょう。
まずセッションプラグインは、
Session | セッションプラグイン |
---|---|
Session::State::Cookie | cookieにセッションIDを登録する |
Session::Store::Memory | メモリにセッションデータを持つ |
を使用します。たとえば、
認証プラグインもセッションと同様に、
今回はOpenID認証を使用しているため、
もちろん、
プラグインの準備ができましたので、
$ ark.pl controller Login
というコマンドでひな形を生成します。
URL的には/loginでログイン、
sub login :Path :Args(0) {
my ($self, $c) = @_;
if (my $user = $c->authenticate) {
# login 成功
$c->redirect( $c->uri_for('/') );
}
}
sub logout :Global {
my ($self, $c) = @_;
$c->logout;
$c->redirect( $c->uri_for('/') );
}
また、
<p>OpenID でログイン</p>
<form method="get">
<p>
<label for="openid_identifier">OpenID URI:</label>
<input type="text" id="openid_identifier" name="openid_identifier" />
</p>
<p><input type="submit" value="login"/></p>
</form>
これでログイン処理は完成です。
モデルを使用する
最後に、
まずテンプレート
? if ($c->user) {
<form method="post">
<p>
<label for="message">メッセージ:</label>
<textarea id="message" name="message"></textarea>
</p>
<p><input type="submit" value="投稿"/></p>
</form>
? } else {
<p>メッセージを投稿するには<a href="<?= $c->uri_for('/login') ?>">ログイン</a>が必要です。</p>
? }
? while (my $msg = $s->{messages}->next) {
<hr />
<dl>
<dt>ID:</dt>
<dd><?= $msg->user ?></dd>
<dt>Date:</dt>
<dd><?= $msg->created_date ?></dd>
<dt>Body:</dt>
<dd><?= $msg->body ?></dd>
</dl>
? }
上から順番に見てみましょう。
? if ($c->user) {
でログイン済みのときはメッセージ投稿フォームを表示させています。そして、
? } else {
の部分では、
そして最後に
? while (my $msg = $s->{messages}->next) {
でメッセージ一覧を表示させています。この$s->{messages}はどこから来たのでしょう。これはコントローラで書いてあげる必要があります。Rootコントローラのindexアクションをこのように書き換えます。
sub index :Path :Args(0) {
my ($self, $c) = @_;
$c->stash->{messages} = $c->model('BBS')->messages;
}
最初に設定したモデルからメッセージ一覧を$c->stashに格納しています。テンプレート内ではこのstashは$sでアクセスできるようになっていますので、
最後に投稿機能を書いていきましょう。indexアクションをさらに以下のように編集します。
sub index :Path :Args(0) {
my ($self, $c) = @_;
if ($c->req->method eq 'POST') {
$c->detach('post');
}
$c->stash->{messages} = $c->model('BBS')->messages;
}
リクエストメソッドがPOSTだった場合
sub post :Private {
my ($self, $c) = @_;
if ($c->user and my $msg = $c->req->param('message')) {
$c->model('BBS')->add_message({
user => $c->user->obj->{display},
body => $msg,
});
}
$c->redirect( $c->uri_for('/') )
}
ユーザがログイン済みでかつ、
動作確認
以上で、
$ ark.pl server -d
として開発サーバを立ち上げてみてください。そしてhttp://
ログインページに飛んで、
ログインの成功、
今回のまとめ
今回は、
Arkアプリケーションはどのような構造になっているか、
ここからさらに先に進みたい方は、
また、
Arkの今後
Arkは現状バージョン0.
現在、
また、
Arkの開発は、
開発に協力してくれるかた、
- #ark @ irc.
perl. org
それでは、