#pgid

* 目次 [#j7be363d]
#contents

* Mapleの組み方講座 [#eaa3b0c3]

** やりたいこと [#u4ced2a8]
Maple(Ver.3.1.0)でログイン認証のシステムを組み込むにあたって、下記を理解できるようにしようと思う

- 第1回
-- mapleでのコード作成方法を理解する
-- コンポーネントの作り方と DI について理解する
- 第2回
-- PEARのDBをコンポーネントとして追加してみる
-- DAOによるアクセスをしてみる

#blikimore

** mapleのインストール [#s8cd9b91]
- 公式サイトから落としてきて解凍して置いたら終わり
-- Maple公式: http://kunit.jp/maple/

- ちなみに、今回説明するMapleのバージョンは 3.1.0

- ただし、Smartyを使う前提なので、maple/smarty/ に最新のSmartyを入れておくこと!


** ログインフォームを表示させる [#u1353984]
- htdocsとmodulesとtemplatesの下に、↓このようにファイルを配置する

 maple_sample
   + htdocs
   |   + login.php
   + webapp
       + modules
       |   + everybody
       |       + login
       |           + default
       |               + Default.class.php
       |               + maple.ini
       + templates
          + everybody
              + login
                  + default.html

※everybody以下は開発者が自由に作成できる


*** ファイル構成 [#h499be29]
- maple_sample/htdocs/login.php
-- ユーザからアクセスされるphpファイル

- maple_sample/webapp/modules/everybody/login/default/Default.class.php
-- Injectionされるメンバ変数の定義と、フレームワークから呼び出されるメソッドの定義

- maple_sample/webapp/modules/everybody/login/default/maple.ini
-- Convert, DIContainer, Action, Viewの定義
--- View以外はここではあまり意味ない。。

- maple_sample/webapp/templates/everybody/login/default.html
-- ログインフォームのテンプレ
--- ポイントは↓このhiddenのvalueが''「次のmodulesの実行クラスになる」''ということ
 <input type="hidden" name="action" value="everybody_login_login">
--- messageとか$action.oContainerLogin.xxxxは次で説明する

※以下の説明では、maple_sample/webapp/までを省略して書くことにする

*** フロー [#u043ecc2]
- ユーザは、htdocs/login.php を実行する
- htdocs/login.php の↓によりmodulesの実行クラスが決定される
 define('DEFAULT_ACTION', 'everybody_login_default');

- mapleフレームワークが実行を開始する
- mapleフレームワークが modules/everybody/login/default/maple.ini によってDIコンテナの作成等行うが、とりあえず今回ははしょる
- modules/everybody/login/default/Default.class.php の execute メソッドが実行される
- modules/.../default/maple.ini の[View]より、templates/everybody/login/default.html の出力をSmartyにより実行される
- 以上。


** 入力チェック [#u5e74775]
- 上のフローから表示されたフォームに「メアド」と「パスワード」を入れて[登録]する
- ↓このhiddenにより次のアクションが決定される
 <input type="hidden" name="action" value="everybody_login_login">
-- このアクションで modules/everybody/login/login/Login.class.php が実行される
-- Everybody_Login_Loginクラスは、executeメソッドでログイン判定をしているわけだが、~
その前に modules/everybody/login/login/maple.ini に記してある内容を実行する
- maple.iniには下記のように記してある
 [Convert]
 mail,passwd,persistence.trim =
 
 [Validate]
 mail.required  = "1,ID(メールアドレス)を入力してください"
 mail.maxlength = "1,メールアドレスは60文字以内で入力してください,60"
 mail.mail      = "0,メールアドレスを正しく入力してください"
 passwd.required  = "1,パスワードを入力してください"
 passwd.maxlength = "0,パスワードは16文字以内で入力してください,16"
 persistence.range = "1,フラグが不正です,0,1"
 
 [DIContainer]
 filename = dicon.ini
 
 [InjectRequest]
 oContainerLogin =
 
 [Action]
 oContainerLogin = "ref:oContainerLogin"
 oLogicLogin     = "ref:oLogicLogin"
 
 [View]
 success = "everybody/login/login.html"
 input   = "everybody/login/default.html"

- ''Convert'' : 入力文字列の変換をかけられる
-- Trim : 前後の空白を取り除く
-- Tohira: 全半角カナを全角かなに変換する
-- Tohalf: 全角英数字を半角英数字に変換する
-- 詳しくはこちら参照→http://kunit.jp/maple/wiki/index.php?%A5%EA%A5%D5%A5%A1%A5%EC%A5%F3%A5%B9#c920be1a

- ''Validate'': 入力チェックができる
-- 第1引数 : その入力チェックでそれ以降のチェックを止めるかどうか (Boolean)
-- 第2引数 : エラー文言 (String)
-- 第3引数以降 : チェック オプション (入力チェック用メソッドの引数)
-- 詳しくはこちら参照→http://kunit.jp/maple/wiki/index.php?%A5%EA%A5%D5%A5%A1%A5%EC%A5%F3%A5%B9#q14a3a8a

- ''DIContainer'': 下でやります

- ''InjectRequest'': 下でやります

- ''Action'': DIContainerと関係あるので、またあとで。

- '' View'': MVCのView (Actionクラスのexecuteでこの文字列を返す)
-- success : 成功時のView
-- input   : Validateで失敗したときにのView

- 各フィルタクラスが呼ばれて実行される
-- Convertの場合は、maple_sample/maple/core/ConverterManager.php
-- Validateの場合は、maple_sample/maple/core/ValidateorManager.php

- Validateに失敗した場合は、''input''というViewが実行される
-- このときActionクラスは実行されない


** リクエストデータのインジェクション [#hbf6d960]
- フォームの場合は、リクエストデータをもとに処理が発生する~
このリクエストデータを格納するクラスを作成する
-- maple_sample/webapp/conponents/container/Login.class.php
--- コンストラクタでNULLに初期化する COLOR(red){''<-必須''}
--- getterを記述する

- そして、このクラスにインジェクトするのが maple.ini に記述した InjectRequest になる
 [InjectRequest]
 oContainerLogin =

- ただ、これだけ書いてもダメで、dicon.ini にそのインスタンスに対するクラスを定義する必要がある
 [oContainerLogin:sample.container.login]

- 上記例の場合、sample.container.loginクラスからoContainerLoginというインスタンスを作っている
-- インジェクションするクラスは maple_sample/webapp/components/ 以下に設置する
--- sample.container.loginクラスの場合は maple_sample/webapp/components/sample/container/Login.class.php と記述する必要がある

- これで、インスタンスは作ったが、Viewにリクエストデータを渡すにはActionに渡してやる必要がある~
そこで、maple.ini で下記のように記述している
 [Action]
  oContainerLogin = "ref:oContainerLogin"

- これでActionのメンバ変数に↓このように記述しておくことで、ActionクラスとViewクラスに渡される
 var $oContainerLogin;

- View (テンプレート)におけるアサインされた変数の利用方法
-- {$action.oContainerLogin.mail} : Actionクラスに割り当てられているoContainerLoginインスタンスのmailメソッドを実行した返値を出力する
-- {action->getFormatDate type="1"} : ActionクラスのgetFormatDateメソッドをパラメータ「array('type'=>1)」で実行した返値を出力する
--- ↑こちらはexample1のpage2を参照
-- {errorList->getMessages assign=messages} : maple_sample/maple/core/ErrorListクラスのgetMessagesメソッド。これでValidateのエラーリストが取れる


** コンポーネントへのインジェクション [#fb3b8008]
- DIについては、まず↓こちら参照~
http://php.y-110.net/wiki/index.php?cmd=read&page=Maple%A1%A7DI&word=maple

- Actionクラスからコンポーネントのクラスを利用するには、dicon.iniとmaple.iniを使うことを~
『リクエストデータのインジェクション』で理解した

- リクエストデータ以外のコンポーネント クラスを利用する場合も同様にdicon.iniとmaple.iniを使う
-- dicon.iniより
 [oDaoUser:sample.database.dao.user]
 
 [oLogicLogin:sample.logic.login]
 oDaoUser = "ref:oDaoUser"

-- sample.database.dao.userクラスのインスタンスがoDaoUser
-- sample.logic.loginクラスのインスタンスがoLogicLogin
--- oDaoUserのインスタンスをoLogicLoginのメンバ変数として利用するようにしている

-- maple.iniより
 [Action]
 oContainerLogin = "ref:oContainerLogin"
 oLogicLogin     = "ref:oLogicLogin"

-- oContainerLoginはリクエストデータをインジェクションしたインスタンス
-- oLogicLoginはLoginロジックを含むクラスのインスタンス

- これでActionクラスのoLogicLoginメンバ変数からoLogicLoginのメソッドを実行できる
 $bResult = $this->oLogicLogin->login($this->oContainerLogin);

- sample.logic.loginは、components/sample/logic/Login.class.php に記述されている
-- ログイン判定を行う
-- ユーザDAOのsetterメソッド
--- ログイン判定をするときに、このsetterを使うため
--- dicon.ini上で記述されている↓を実行するのに使用される(?:Actionはいらないのに?)
 [oLogicLogin:sample.logic.login]
 oDaoUser = "ref:oDaoUser"


** 〆める [#cc475fbc]
- たぶんこれくらいで時間がなくなると思うので、一旦〆める
-- 次回は、DAOによるデータの取得と設定についてやります

- 組み方の特徴としては。。
-- Actionクラスは1画面につき1ディレクトリ
-- maple.iniに Convert や Validate が書ける
-- ActionクラスとComponentsを分けて管理できる
-- Smartyを利用できる

- mapleを使う開発では、Actionクラスと各Componentsとの依存性は大分薄れている~
あとは、各Component間で依存させないように工夫して実装していく必要があるように思う。
-- この辺りについては、またのちほど公開する


----
- mapleによるDIの種類は、デフォルトでは''セッター・インジェクション''のみ
-- DIContainer2フィルタを使えば、''コンストラクタ・インジェクション''と''factoryメソッドによる初期化''にも対応している

----
* 勉強会あとがき [#k22e818c]
-竹村:
-- 以前のMapleを私は知らないが、、以前に比べるとなにやら物凄い洗練されたものになっているらしい
-- ValidateやConvertで日本語について取り扱っているところなど、日本人っぽい細かさを感じるところがあるようだ


----
#blikifooter(竹村)
- <a href='http://www.insurance-top.com'>car insurance</a> : [http://www.insurance-top.com auto insurance] - [HTTP://www.insurance-top.com auto insurance] : [Insurance car|http://www.insurance-top.com] - [Insurance car|HTTP://www.insurance-top.com] : http://www.insurance-top.com/auto/ : [[http://www.insurance-top.com insurance quote]] : [[http://www.insurance-top.com | home insurance]] : "cars insurance" http://www.insurance-top.com : [http://www.insurance-top.com|insurance auto] -- [[car insurance]] &new{2006-06-24 (土) 17:14:54};

#comment

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

アークウェブのサービスやソリューションはこちら