2011-02-04 20:35:41

PHPフレームワーク Ethnaを使おう!

テーマ:PHP
はじめまして,CyberXエンジニアの石川です.

CyberXではアプリ開発は,通常CakePHPを使用しています.
が,今回は,PHPフレームワークの一つEthnaを紹介します.

PHPの代表的フレームワークとしてZend Frameworkや,CakePHPSymphonyなどが有名ですが,EthnaもそういったPHPフレームワークの一つです.
Ethnaは,GREEで開発,利用されています.
かなりカスタマイズされていると思いますが,GREE規模のアプリケーションで利用可能というのは大きな実績を持っていると言えます.

それでは,Ethnaのディレクトリ構造から見ていきましょう.

app (アプリケーションのスクリプト)
┃ ┣ action (アクションスクリプト)
┃ ┣ action_cli (CLI用アクションスクリプト)
┃ ┣ action_xmlrpc (XMLRPC用アクションスクリプト)
┃ ┣ plugin (フィルタスクリプト)
┃ ┣ test (テストスクリプト)
┃ ┗ view (ビュースクリプト)
┣ bin (コマンドラインスクリプト)
┣ etc (設定ファイル等)
┣ lib (アプリケーションのライブラリ)
┣ locale
┃ ┗ ja_jp
┣ log (ログファイル)
┣ schema (DBスキーマ等)
┣ skel (アプリケーション用スケルトンファイル)
template
┃ ┗ ja_jp (テンプレートファイル)
┣ tmp (一時ファイル)
┗ www (ウェブ公開用ファイル)
  ┣ css (CSSファイル)
  ┗ js (JavaScriptファイル)

今回は,良く扱うファイルを実際のコードと合わせてご説明します.

今回作るプログラムは下記の様なものです.
・ログインフォーム.
・user_infというテーブルがある.
 (カラムとしてidとpasswdを持っている.)
・ユーザはIDとパスワードを入力してログイン.


1.ActionClassとActionForm
ファイル:app/action/Login.php

class Sample_Form_Login extends Ethna_ActionForm
{
// フォームの定義
var $form = array(
'id' => array(
'type' => VAR_TYPE_STRING,
'form_type' => FORM_TYPE_TEXT,
'name' => 'ID',
'required' => true,
),
'passwd' => array(
'type' => VAR_TYPE_STRING,
'form_type' => FORM_TYPE_PASSWORD,
'name' => 'ログインパスワード',
'required' => true,
),
);
}
class Sample_Action_Login extends Ethna_ActionClass
{
// 前処理
public function prepare() {
}

// メイン処理
public function perform() {
$result = false;
if ($this->af->validate() == 0) {
$id = $this->af->get('id');
$passwd = $this->af->get('passwd');
$userMng =& $this->backend->getManager("User");
$result = $userMng->auth($id, $passwd);
}
if ($result === false) {
$this->ae->add("loginerror", "ログインエラー");
return "login";
} else {
return "mypage";
}
}
}

Ethnaの特徴の一つがActionFormです.
ActionFormでは,フォームから渡ってくる値を定義できます.
ここではidとpasswdを定義しています.
定義に関して詳しくは,こちらのドキュメントを参考にしてください.

次に,ActionClassでは,実際のアクションを記述します.
ここでは,フォームから受け取ったidとpasswdをUserManagerのauthメソッドで検証しています.
ActionClassについてより詳しい解説は,こちらのドキュメントを参考にしてください.

このプログラムでは,まずvalidateでActionFormに記述した内容に沿ってバリデートされます.
バリデートの結果が,0の時に引数として,idとpasswdをUserManagerのauthメソッドに渡します.
その結果trueであれば,mypageテンプレートを表示し,falseの場合にはもう一度loginテンプレートを表示する様になっています.

2.AppObjectとAppManager
ファイル:app/Sample_UserManager.php

class Sample_UserInf extends Ethna_AppObject
{
}

class Sample_UserManager extends Ethna_AppManager
{
public function auth($id, $passwd) {
$userInf = $this->backend->getObject('UserInf', "id", $id);
$pass = $userInf->get("passwd");
if ($passwd == $pass && $pass != "") {
return true;
}
return false;
}
}
?>

AppObjectは,EthnaのORマッパーです.
ここでは,利用するテーブルに関して,メッソド追加などが行えます.
詳しくは,こちらのドキュメントを参考にしてください.

AppManagerは,いわゆるMVCのModelに該当します.
ここでは,authメソッドがあり,authメソッドでは,idから対象ユーザの情報を取得し,そのpasswdが一致すればtrue,しなければfalseを返す様になっています.
詳しくは,こちらのドキュメントを参考にしてください.

3.テンプレート
template/ja_JP/login.tpl

{foreach from=$errors item=error}
{$error}

{/foreach}

{form ethna_action="login" action="/login.php"}
ID {form_input name="id" size="20"}
パスワード {form_input name="passwd" size="8"}
{form_submit value="ログイン"}
{/form}



最後にテンプレートの解説をします.
基本的にEthnaでは,Smartyを利用します.
本来のSmartyと違う部分としては,{form}タグです.
{form}タグでの記述はformタグとして出力されます.
(※ethna_actionに記述された内容はaction指定がinputのhiddenとして生成されます)
{form_input}では,先に記述したActionFormの定義に沿ってinputタグが生成されます.
{form_submit}では,submitボタンが生成されます.


最後に,今回は時間の都合上,表面上の説明しか出来ませんが,Ethnaには他にも便利な機能が様々備わっています.
PHPフレームワークは多数ありますが,その中でも大変魅力的なフレームワークの1つと言えます.

Ethnaについて少しでも興味を持って頂ければ幸いです.

社内で発表した際の資料はこちら


参考
・Ethna
http://ethna.jp/
・Smarty
http://www.smarty.net/docsv2/ja/
いいね!した人  |  コメント(0)  |  リブログ(0)

cyberxtecさんの読者になろう

ブログの更新情報が受け取れて、アクセスが簡単になります

コメント

[コメントをする]

コメント投稿