ColdFusion Webアプリケーションフレームワーク入門

COLDFUSION
WEBアプリケーションフレームワーク入門
-COLDBOXの使い方-
JCFUG
2015/01/23
© 2015 Ortus Solutions, Corp & Luis Majano
スピーカーについて

JCFUGマネージャー

1998年のCF日本進出から一貫して、受託開発・コン
サルティング・トレーニング講師等で活動
Macromedia COLDFUSION MX
認定デベロッパー試験 公式ガイド
監修・翻訳担当
ソフトバンククリエイティブ刊
ISBN 4-7973-2665-4
2004年3月刊

ColdFusion 8 プロフェッショナルガイド
編著・監修担当
毎日コミュニケーションズ刊
ISBN 978-4839925802
2008年4月刊
ColdFusion
セキュリティ設定代行
サービス
CFの受託案件やコンサルなどお仕事も募集中!
株式会社エスアイヤ
河野 俊之 ([email protected])
木戸間 周平([email protected])
JCFUGのご紹介




JCFUG - Japan ColdFusion User Group –
http://jcfug.com/
Adobe Japan 公式コミュニティーの中で、
もっとも歴史がある
オンラインを中心とした活動で、
現在のアクティブメンバーは700名以上
老若男女、ColdFusionの経験を問わず
メンバー募集中!
概要
• フレームワークについて
– フレームワークとは
– 主なWeb用フレームワーク/ライブラリの種別
– フレームワークでどう変わるか
• 使った場合と使わない場合との違い
• MVC2モデル
– ColdFusion用フレームワークの紹介
• ColdBoxの概要
– 特徴
– 仕組み
• 主な構成要素
• 基本の流れ
• エンティティの扱い/データアクセス
• バリデーション
• まとめ
フレームワークとは
•
アプリケーションフレームワーク (Application Framework) とは、プログラミングに
おいて、特定のオペレーティングシステムのためのアプリケーションの標準構造
を実装するのに使われるクラスやライブラリの集まりである。単にフレームワーク
とも呼ぶ
•
多くの再利用可能なコードをフレームワークにまとめることによって、開発者の手間を
省き、新たなアプリケーションのために標準的なコードを改めて書かなくて済むように
する
(Wikipediaより)
•
デスクトップアプリケーション用
– MFC, Cocoa, GNOME, KDE, .net Framework, Java FX など
•
Webアプリケーション用
– Struts2, SAStruts, JSF, ASP.net, Ruby on Rails, CakePHP, Django など
– JavaScript用フレームワークもある
•
HTML/CSSのフレームワークといったものもある
– 定義済みCSS等のセット、レスポンシブ対応。Bootstrap など
主なWeb用フレームワーク/ライブラリの種別
• Webアプリケーションフレームワーク
– Webアプリの流れや構成
– Ajax/REST対応
• テンプレートエンジン
– HTMLレンダリング
軽量フレームワーク
(多分こんな感じ)
• バリデーションライブラリ
– 入力値の検証
• ORM
– データの永続化/DB処理
• DIコンテナ
– クラス/インスタンスの管理、疎結合
• AOP
– 関心の分離、疎結合
• 単体テスト
– テストコードによる自動テスト
フルスタックフレームワーク
フレームワークでどう変わるか
• アプリケーションの構造を整理する手助けになる
– フレームワークのコンセプトに沿った整理が促進される
– ある程度方針が決まっているため、土台の作りについて悩まなくてよい
• 基本構造を毎回作らなくてよくなる
–
–
–
–
初期化
データアクセス
インスタンスの管理/関数のロード
ファイルの置き場所、関数の置き場所などの確保
• 決まったディレクトリ構造、決まった置き場所
–
–
–
–
–
–
セッション管理
バリデーション処理
エラー処理
ロギング
セキュリティ
その他
• カバーする範囲はFWによって異なる
フレームワークでどう変わるか
• 例:FWを使わない場合にありがちな構造
– 一つのcfmが画面と一対一に対応
– ロジック、データアクセス、プレゼンテーション全てが
一枚のファイルに書かれている
HTTP Request
処理
SQL
バリデーション
表示
HTTP Response
cfm
DB
フレームワークでどう変わるか
• これはこれで分かりやすいが・・・
– 処理が分離していないため、似たような別の処理を書く時
に、コピーせざるを得ない
• 処理を外部に追い出すとしても追い出す先に悩むことになる
処理
SQL
バリデーション
処理
SQL
バリデーション
コピペ
表示
表示
cfm
cfm
フレームワークでどう変わるか
• コピーすると、その場は良いのだが・・・
– 修正が入ると、その都度全部直さなくてはならない
– 修正=リリース後の改修のみならず開発中の変更、
試行錯誤も含む
修正
修正漏れ
処理
SQL
バリデーション
処理
SQL
バリデーション
処理
SQL
バリデーション
処理
SQL
バリデーション
表示
表示
表示
表示
cfm
cfm
cfm
cfm
フレームワークでどう変わるか
• 現在の主流:MVCモデル(MVC2)
• 役割ごとに分ける
– Model(cfc):そのアプリケーションで本来したいこと全般とそのデータ
表現(ドメインモデル)を書く
– View(cfm):表示に伴う処理を書く(webの場合主にHTML出力)
– Controller(cfc):処理の起点。入力に応じてModelを起動し、
Viewを呼び出す
DB
Controller
HTTP Request
Model
View
HTTP Response
フレームワークでどう変わるか
• 変更に強い、再利用し易い
– 再利用=そのシステムの中で使いまわせる
• これは設計の問題であって、FWを使わなくても同じことは可能。逆に
使用してもそうならないように作ることも可能ではあり、FWはあくまで
方向づけの一つに過ぎない
Controller
REST
View
JSON
ModelA
DB
Controller
HTML
View
HTML
ModelB
フレームワークでどう変わるか
• 一方でフレームワークを使うと・・・
– 覚えるコストがかかる
• 同じFWを使い続けることによって回収する
– 実行速度が多少落ちるケースもある
• FWが裏で色々やっていることがあるので・・・
– MVCで分けるとは言ってもどこに何を書くべきかなどの設計に
は、経験、慣れが必要
•
設計の話なので割愛するが、MVCのあるべき姿については一時期一部
で盛り上がっていた模様。この辺りが面白いのでは・・・
– MugeSoの日記:PHPerのMVCの一体どこが間違っていたのか
http://d.hatena.ne.jp/MugeSo/20121224/1356345261
– F’s Garage:MVCにおけるcontrollerクラスの役割は時代と共に変わって行く
http://f-shin.net/fsgarage/638
ColdFusion用フレームワーク
•
•
•
•
Struts (2001~ OO/XML)
Fusebox 5.5 (1997~ 非OO → 後にOO)
Ruby on Rails (2004~ OO/non XML)
CF界最古のフレームワーク。更新停止
CakePHP (2005~ OO/non XML)
http://www.fusebox.org/
Mach II 1.8 (2003~ OO/XML)
CFで最初のオブジェクト指向(Object-Oriented)フレームワーク。更新停止
http://mach-ii.com/
Model-Glue: 3.2 RC 2 (? OO/non XML)
イベントベースのOOフレームワーク。更新停止
http://www.model-glue.com/
ColdBox 3.8.1 (2006~ OO/non XML)
ORMサポートなどが色々ついたフルスタックのフレームワーク。2014/10に4.0.0 RCリリース
http://www.coldbox.org/
•
CFWheels 1.3.2 (2009~ OO/non XML)
RoRにインスパイアされたフレームワーク。本家同様ActiveRecordパターンのORMを持つ
2014/11更新。
http://cfwheels.org/
•
FW/1 - 2.5 (2010~ OO/non XML)
設定より規約(convention over configuration)に則った軽量フレームワーク。2014/08に3.0 Beta1リ
リース。DI 1というDIコンテナもある
http://fw1.riaforge.org/
ColdBoxとは
•
オープンソース
•
2006年から開発されている
•
MVC, DI, AOP, ORM, ユニットテストなど幅広いレイヤをサポート
•
Adobe, GE, Kennedy Space Center, NASA JPL, US Airforceなどで使用されている
•
ドキュメントが豊富(英語)
– 本も出ている
•
中の人+有志による様々な拡張機能
– http://www.coldbox.org/forgebox
•
カンファレンスもやっているらしい
– http://www.intothebox.org/
かなり力が入っているFWといえるのではないか?
→ 更新が止まるとやはりあまりよろしくないので重要
ColdBoxの特徴
•
イベントドリブン/フロントコントローラー
– ファイルベースではなく、自分でつけたイベント名で処理を動かしていく
•
設定より規約
– 開発者の決定すべきことを減少させ、単純にするが柔軟性は失わせないというソフトウェア
設計パラダイム
– XMLに設定を書かずにディレクトリ/ファイル名などの一定のルール付けで解決する
•
4つの内部フレームワークを持つ(単体利用も可能)
–
–
–
–
•
•
•
•
•
•
WireBox:DI(依存性注入)とAOP(アスペクト指向プログラミング)のフレームワーク
LogBox:Log4J風のログライブラリ
CacheBox:キャッシュエンジン
MockBox:テスト用モック、スタブ作成のフレームワーク
CFORM(Hibernate)を統合
Ajaxサポート
RESTful/SOAPサポート
Adobe Flex/Airの統合とモニタリング
xUnit/BDDのサポート
様々なDSL(キャッシュ、 DI/AOP、 ロギング、モック作成などで使える独自記法)
ColdBoxの特徴
ColdBoxの仕組み
• 以下について簡単に解説
– 主な構成要素
– 基本の流れ
– エンティティの扱い/データアクセス
– バリデーション
ColdBoxの仕組み-主な構成要素
• イベントハンドラ(controller)
– ユーザーからのリクエスト(イベント)を受け取るエンドポイント
– ColdBoxオブジェクト
• モデル(model)
– アプリで行いたい処理を実行する
– ColdBoxオブジェクトである必要はなく勝手に作ってよい
– エンティティも含む
• レイアウト/ビュー(view)
– レイアウト:ヘッダ、フッタなどの共通部分のcfmテンプレート
内部にビューをインクルードして使う
– ビュー:各画面を描画するcfmテンプレート
ColdBoxの仕組み-その他の構成要素
• モジュール
– 独立した画面等も含むことができる拡張機能
• カート、ブログ、 ユーザー管理、セキュリティなど
• プラグイン
– 画面を伴わない拡張機能
• バリデーション、ORM拡張、多言語化、各種ユーティリティなど
• 4.0で廃止。モジュールに統合される模様
• インターセプター(Intercepting Filterパターン)
– リクエスト/レスポンスの前後やその他に用意された各種のインターセ
プションポイントでフィルター的に処理を実行する機能
• Application.cfm/cfcやOnRequestEnd.cfmで
全体処理を実行するようなイメージ
ColdBoxの仕組み-主な構成要素
• ファイル/ディレクトリ構成
/www/ApplicationDir
/config
/handlers
フレームワークの設定関係
ハンドラ置き場
Article.cfc
Main.cfc
/layouts
レイアウト置き場
Main.cfm
/models
モデル置き場
/article
Article.cfc
ArticleService.cfc
/utilities
/modules
/views
ColdBoxの拡張機能
ビューファイル置き場
/article
list.cfm
Detail.cfm
Application.cfc
Index.cfm
ColdBox本体呼び出し箇所
cfm起動のためのダミーファイル
(アクセスは基本的に全てここで受ける)
ColdBoxの仕組み-基本の流れ
ColdBoxの仕組み-基本の流れ
• イベントドリブン
– http://hoge/bbs/index.cfm?event=article.list
– http://hoge/bbs[/index.cfm]/article/list/
•
ハンドラ
– /bbs/handlers/Article.cfc
<cffunction name="list" returntype="void">
<cfargument name="event">
<cfargument name="rc">
<cfargument name="prc">
<cfset prc.qArticle = articleService.listTreeQuery(rc.row)>
<cfset event.setView("article/list")>
</cffunction>
ColdBoxの仕組み-基本の流れ
• イベントドリブン
– http://hoge/bbs/index.cfm?event=article.list
– http://hoge/bbs[/index.cfm]/article/list/
mod_rewriteなどで省略可能
•
ハンドラ
– /bbs/handlers/Article.cfc
<cffunction name="list" returntype="void">
<cfargument name="event">
<cfargument name="rc">
<cfargument name="prc">
<cfset prc.qArticle = articleService.listTreeQuery(rc.row)>
<cfset event.setView("article/list")>
</cffunction>
ColdBoxの仕組み-基本の流れ
• イベントドリブン
– http://hoge/bbs/index.cfm?event=article.list
– http://hoge/bbs[/index.cfm]/article/list/
イベント名
•
ハンドラ
– /bbs/handlers/Article.cfc
<cffunction name="list" returntype="void">
<cfargument name="event">
<cfargument name="rc">
<cfargument name="prc">
<cfset prc.qArticle = articleService.listTreeQuery(rc.row)>
<cfset event.setView("article/list")>
</cffunction>
ColdBoxの仕組み-基本の流れ
• イベントドリブン
– http://hoge/bbs/index.cfm?event=article.list
– http://hoge/bbs[/index.cfm]/article/list/
•
ハンドラ
Cfc名を名前で紐付け
– /bbs/handlers/Article.cfc
<cffunction name="list" returntype="void">
<cfargument name="event">
<cfargument name="rc">
<cfargument name="prc">
<cfset prc.qArticle = articleService.listTreeQuery(rc.row)>
<cfset event.setView("article/list")>
</cffunction>
ColdBoxの仕組み-基本の流れ
• イベントドリブン
– http://hoge/bbs/index.cfm?event=article.list
– http://hoge/bbs[/index.cfm]/article/list/
•
ハンドラ
メソッド名を名前で紐付け
– /bbs/handlers/Article.cfc
<cffunction name="list" returntype="void">
<cfargument name="event">
<cfargument name="rc">
<cfargument name="prc">
<cfset prc.qArticle = articleService.listTreeQuery(rc.row)>
<cfset event.setView("article/list")>
</cffunction>
ColdBoxの仕組み-基本の流れ
• イベントドリブン
– http://hoge/bbs/index.cfm?event=article.list
– http://hoge/bbs[/index.cfm]/article/list/
•
ハンドラ
– /bbs/handlers/Article.cfc
Request Collection
→URL/Formパラメータが入る
Private Request Collection
<cffunction name="list" returntype="void">
→データ受け渡しに使える
<cfargument name="event">
<cfargument name="rc">
<cfargument name="prc">
<cfset prc.qArticle = articleService.listTreeQuery(rc.row)>
<cfset event.setView("article/list")>
</cffunction>
ColdBoxの仕組み-基本の流れ
• ハンドラ
– /bbs/handlers/Article.cfc
<cffunction name="list" returntype="void">
<cfargument name="event">
<cfargument name="rc">
<cfargument name="prc">
Modelからデータ取得
<cfset prc.qArticle = articleService.listTreeQuery(rc.row)>
<cfset event.setView("article/list")>
</cffunction>
• ビュー
– /bbs/views/article/list.cfm
Viewファイルの呼び出し
ColdBoxの仕組み-基本の流れ
• ビュー
– /bbs/views/article/list.cfm
・・・
<cfloop query=“prc.qArticle”>
<div class=“row”>
<p>タイトル:#prc.qArticle.Title#</p>
<p>
#prc.qArticle.Body#
</p>
</ div >
</cfloop>
・・・
prcの値を使用
(rcも使える)
ColdBoxの仕組み-基本の流れ
• 詳しくは以下を参照
– ColdBox Overview
• http://wiki.coldbox.org/wiki/ColdBox.cfm
• どうもDBを使わない、ごく簡単なサンプルがない?
– とりあえずColdBoxバンドル版に含まれる
/ApplicationTemplates/Simple
を見てみるのがいいかも
– DBを用意するのがやや面倒だが、
/samples/applications/SimpleBlog/simple_blog_5
には一通りの処理が入っている
– 4.0用にはhelloworldというサンプルが作られている模様
• https://github.com/ColdBox/coldboxsamples/tree/master/applications/helloworld
ColdBoxの仕組み-エンティティの扱い
• Queryオブジェクトをそのまま使うこともできる
が、基本的にはcfcにデータや振る舞いを実装
することを想定
• そうしたcfcと物理DBを繋ぐためのツールが用
意されている(CFORM/Hibernateのラッパー)
– ColdBox 3.x系だとORMService Plug-in
– ColdBox 4.x系だとcborm module
• ここでは、そうしたDBと繋ぐ機能について解説
ColdBoxの仕組み-エンティティの扱い
• 大まかに言って3パターンある
• http://wiki.coldbox.org/wiki/Models.cfm
– Solo Style
• ColdBoxのサポート機能をあまり使わないパターン(割愛)
• Query → モデルへの代入など便利機能あり
– ActiveEntity Style
• cfcをテーブルの1レコードに直接マッピングし、自分自身に
操作メソッドを持たせる
• いわゆるActiveRecordパタ-ン
– Virtual Service Layer Style
• エンティティを操作するサービス層を提供
• いわゆるトランザクションスクリプト的にするのか、ドメインモデル
的にするのかはまた別の話で、とりあえずそういう機能があるとい
う点だけ・・・
ColdBoxの仕組み-エンティティの扱い
• 例えば、掲示板アプリのデータ構造を考える
– 投稿記事
•
•
•
•
•
ID
件名
投稿者名
内容
投稿時刻
ColdBoxの仕組み-エンティティの扱い
• 例えば、掲示板アプリのデータ構造を考える
– 投稿記事
•
•
•
•
•
ID
件名
投稿者名
内容
投稿時刻
<!--- Article.cfc --->
<cfcomponent>
<cfproperty name=“articleID”>
<cfproperty name=“title”>
<cfproperty name=“author”>
<cfproperty name=“content”>
<cfproperty name=“regDate”>
・・・
それぞれcfcのプロパティ
として割り当てる
</cfcomponent>
ColdBoxの仕組み-エンティティの扱い
• 例えば、掲示板アプリのデータ構造を考える
<!--- Article.cfc --->
<cfcomponent>
<cfproperty name=“articleID”>
<cfproperty name=“title”>
<cfproperty name=“author”>
<cfproperty name=“content”>
<cfproperty name=“regDate”>
Articleテーブル
列名
型
articleID
Integer
title
Varchar
Author
Varchar
Content
Text
regDate
Date
・・・
</cfcomponent>
格納先のテーブルを用意
DB
ColdBoxの仕組み-エンティティの扱い
• ActiveEntity Styleの場合
DBのarticleテーブルにマッピング
(4.0だとexends指定が異なる)
<!--- Article.cfc --->
<cfcomponent persistent=“true” table=“article”
extends=“coldbox.system.orm.hibernate.ActiveEntity”>
<cfproperty name=“articleID” fieldtype=“id” generator=“native”>
<cfproperty name=“title” ormtype=“string”>
<cfproperty name=“author” ormtype=“string”>
<cfproperty name=“content” ormtype=“string”>
<cfproperty name=“regDate” ormtype=“date”>
・・・
</cfcomponent>
ColdBoxの仕組み-エンティティの扱い
• ActiveEntityクラスにより自動的にメソッドが補完
– 一件取得
• prc.article = entityNew("Article").get( rc.id );
– リスト取得
• prc.articles = entityNew("Article").list(
sortOrder=“regDate",asQuery=false);
– 削除
• entityNew("Article").deleteByID( rc.id );
– 保存(新規/更新は自動振り分け)
• event.paramValue("id",0);
• article = populateModel( entityNew("Article").get( rc.id ) );
• article.save();
CFCで静的メソッドが使えないため、常にインスタンスを作成
しないといけない点がやや苦しい・・・
ColdBoxの仕組み-エンティティの扱い
• 保存(新規/更新は自動振り分け)
– event.paramValue("id",0);
• rc.idの初期化。<cfparam>と同じ動作
– article =
populateModel( entityNew(“Article”).get( rc.id ) );
• populateModel({cfcインスタンス})
– rcからパラメータをとって、渡されたインスタンスの同名プロパ
ティに自動的に代入
• entityNew(“Article”).get( rc.id )
– rc.idと同じArticleIDのレコードがあったら、ロードしてインスタンス
を作成、無かったら空のインスタンスを作成
– article.save();
• インスタンスがロードされたものだったらUPDATE、新規だっ
たらINSERTを行う
ColdBoxの仕組み-エンティティの扱い
• Virtual Service Layer Styleの場合
<!--- Article.cfc --->
<cfcomponent persistent=“true” table=“article”>
DBのarticleテーブルにマッピング
Extendsはしない
POJO的な単なる普通のcfc
<cfproperty name=“articleID” fieldtype=“id” generator=“native”>
<cfproperty name=“title” ormtype=“string”>
<cfproperty name=“author” ormtype=“string”>
<cfproperty name=“content” ormtype=“string”>
<cfproperty name=“regDate” ormtype=“date”>
・・・
</cfcomponent>
ColdBoxの仕組み-エンティティの扱い
• 基本機能だけの場合、サービスクラスは作らなくてよい。
• ArticleエンティティとVirtualEntityServiceがバインドされた
状態のインスタンスを、 DIコンテナから取得できる
• <cfproperty name=“articleService"
inject="entityService:Article“>
– WireBoxのDSLとして「inject」という属性が拡張されている
– Articleエンティティ用に初期化されたentityServiceのインスタンスが
自動作成
– entityServiceに定義済みのメソッドを使い、ハンドラ/モデル内でエン
ティティを取り出せるようになる
• 別途サービス用クラスを作成し、VirtualEntityServiceを継承して、
独自拡張することも可能
ColdBoxの仕組み-エンティティの扱い
• 取得したarticleServiceを使って操作が可能となる
– 一件取得
• prc.article = articleService.get( rc.id );
– リスト取得
• prc.articles = articleService.list(
sortOrder=“regDate",asQuery=false);
– 削除
• articleService.deleteByID( rc.id );
– 保存(新規/更新は自動振り分け)
• event.paramValue("id",0);
• article = populateModel( articleService.get( rc.id ) );
• articleService.save(article);
ColdBoxの仕組み-エンティティの扱い
• 詳細は以下を参照
– Model Integration Guide
• http://wiki.coldbox.org/wiki/Models.cfm
– リレーション構造を含むサンプル
• /samples/applications/SimpleBlog/simple_blog_5
– DBと直接関連していないモデルクラスもDIコンテ
ナ経由で取り出せる
• http://wiki.coldbox.org/wiki/WireBox.cfm
ColdBoxの仕組み-エンティティの扱い
• 課題
– ColdBoxというよりも一般的な課題だが、複雑なリレーショ
ンを含む場合、ORMへのマッピング定義が難しい
• ORMを使うことによる新たな問題
• ORMを使わなくても、手動でRDB⇔オブジェクト化はできるがそれ
はそれで面倒
– 多量のデータ、複雑なリレーションはSQLを直接書いた方
が扱い易い
• ORM経由でのクエリオブジェクト取得や、ORMとネイティブクエリ
の併用も可能だが、Queryオブジェクトとして取得すると、利用す
る際のインターフェースが異なるため、使う側で工夫が必要
• 速度面でもSQLの方がチューニングし易いため、一覧系はSQL、詳
細画面はORM経由で省力化など、ある程度の割り切りが現実
的?
ColdBoxの仕組み-バリデーション
• ColdBoxのバリデーションエンジンは基本的には、モ
デル(エンティティ)に対して、制約として記述する
• ハンドラ内などで、独自のバリデーション設定を作る
こともできる
• その場合、モデルあるいは構造体(rc/prcなど含む)に対
してチェックを行える
• バリデーションのルールは、基本的なものが予め定
義済みだが、独自のルールも作成可能
• 独自ルールはUDFで定義できるので、DBを見るなど実装
依存の処理も追加可能
ColdBoxの仕組み-バリデーション
• バリデーション制約の例
<!--- Article.cfc --->
<cfcomponent persistent=“true” table=“article”>
<cfproperty name=“articleID” fieldtype=“id” generator=“native”>
<cfproperty name=“title” ormtype=“string”>
<cfproperty name=“author” ormtype=“string”>
<cfproperty name=“content” ormtype=“string”>
<cfproperty name=“regDate” ormtype=“date”>
<!--- validation -->
<cfset this.constraints = {
title= {required=true},
author = {required=true},
content = {required=true, size=1000}
}>
</cfcomponent>
ColdBoxの仕組み-バリデーション
• チェックを実行
cfcに書いたバリデーション
ルールが実行される
<!--- Handler.cfc --->
<cffunction name=“save”>
<cfset event.paramValue("id",0)>
<cfset var article = populateModel( articleService.get( rc.id ) )>
<cfset var vResults = validateModel(article)>
<cfif !vResults.hasErrors() >
<cfset articleService.save(article )>
<cfset getPlugin("MessageBox").info(“Article Saved!")>
<cfset setNextEvent("articles")>
<cfelse>
<cfset getPlugin("MessageBox").error(messageArray=vResults.getAllErrors())>
<cfreturn editor(event,rc,prc)>
</cfif>
</cffunction>
ColdBoxの仕組み-バリデーション
• 組み込みのルール(一部)
– required:必須チェック
– type:型チェック
– max, min:最大最小
– size:文字や配列のサイズ(長さ)チェック
– regex:正規表現パターンを書けるチェック
– inList:リストに含まれるかどうか
– udf:チェック結果を返す任意のUDFを実行
– method:オブジェクト内の任意のメソッドを実行
(udfとどう違うのか?)
ColdBoxの仕組み-バリデーション
• 詳細は以下を参照
– ColdBox Object & Form Validation Engine
• http://wiki.coldbox.org/wiki/Validation.cfm
– サンプル
• /samples/applications/Validation
まとめ&CFフレームワーク利用の課題
•
フレームワークを使うことでその思想に則った開発がし易くなる
– ただし、学習コストがそれなりにかかる
– 設計思想が肌に合わない場合、別のものに乗り換える勇気
•
2015/01時点でアクティブなCF用のWebアプリケーションフレームワークはおよそ3
種類
– いずれも日本語のドキュメントはない
– 英語でも解説書などがほぼないため、ある程度フレームワークの中身を追わないと何をして
いるのかよく分からないことが多い
•
•
ColdBoxは様々なレイヤをサポートしており、いわゆるモダンな開発への近道とな
りうる
ColdBoxに限らず、DI/AOP絡みの言語拡張でありがちだが、どこに何が書けるの
かよくわからない。設定にエラーが出ているが何が原因なのかよくわからない
– これもフレームワーク本体のソースを見るのが早そう
•
今からColdBoxを触るのであれば、4.0の方がよいかも
– ドキュメントはまだ書き換わっていないが、一部の変更点以外は大体同じ
•
変更点:http://wiki.coldbox.org/wiki/Compatibility:4.0.0.cfm
– サンプルも動いたり動かなかったりするが、GitHubを見ていると、ちょうどいま書き換えてい
る途中のようなので、しばらくしたら直っていたりするかも
– また、一部設定を変えれば動いたりもする
ありがとうございました
• ColdBox
– http://www.coldbox.org/
• ColdBox Bundle版に色々なサンプルが付属している
(一部要DB)
– https://github.com/coldbox
• 4.0 RC用のサンプルはGithubから。現在調整中?
– http://runnable.com/ColdBox
• サイト上で動かせるサンプル
• JCFUG
– http://jcfug.com/
• CFに関する質問、回答、その他受付中!