Cejuno Framework内部処理の流れとコアアーキテクチャ概要 (2/3)

 / 
  • HOME > 
  • 全ての記事 > 
  • Cejuno Framework内部処理の流れとコアアーキテクチャ概要

目次

  1. ページファイル
  2. Cejuno Frameworkの内部処理フロー(概要)
  3. Cejuno Frameworkの「核」Entity
    1. Property要素
    2. Propertyごとに「DB」「フォーム」「一覧表示」を一括定義
    3. Confirm項目や結合項目もXMLだけで表現
    4. マスタ連動や複合フォームも一元化
    5. ViewConfigによる画面単位の設定
    6. EntityコンフィグがCejunoの「核」である理由
    7. 他フレームワークとの違い
  4. DataAccessコンフィグ
    1. Environment単位でデータソースを切り替えられる構造
    2. DataSourceNameはEntityコンフィグと1対1で紐づく
    3. Adapter体系の思想
    4. 呼び出し側から見ると“1つのクラスしかない”
    5. Taskとの連携:フレームワーク利用者は「何も意識しない」
    6. 他フレームワークとの違い
 

Cejuno Frameworkの「核」Entity

Cejuno FrameworkにおけるEntityは、「システムが扱う情報のまとまり」を定義する最小単位です。
この例では、Member という名前のEntityとして、会員情報に関するあらゆる要素がひとつのXMLの中に集約されています。

3-1. Entityコンフィグ(抜粋)

1 :
2 :
3 :
4 :
5 :
6 :
7 :
8 :
9 :
10 :
11 :
12 :
13 :
14 :
15 :
16 :
17 :
18 :
19 :
20 :
21 :
22 :
23 :
24 :
25 :
26 :
27 :
28 :
29 :
30 :
31 :
32 :
33 :
34 :
35 :
36 :
37 :
38 :
39 :
40 :
41 :
42 :
43 :
44 :
45 :
46 :
47 :
48 :
49 :
50 :
51 :
52 :
53 :
54 :
55 :
56 :
57 :
58 :
59 :
60 :
61 :
62 :
63 :
64 :
65 :
66 :
67 :
68 :
69 :
70 :
71 :
72 :
73 :
74 :
75 :
76 :
77 :
78 :
79 :
80 :
81 :
82 :
83 :
84 :
85 :
86 :
87 :
88 :
89 :
90 :
91 :
92 :
93 :
94 :
95 :
96 :
97 :
98 :
99 :
100 :
101 :
102 :
103 :
104 :
105 :
106 :
107 :
108 :
109 :
110 :
111 :
112 :
113 :
114 :
115 :
116 :
117 :
118 :
119 :
120 :
121 :
122 :
123 :
124 :
125 :
126 :
127 :
128 :
129 :
130 :
131 :
132 :
133 :
134 :
135 :
136 :
137 :
138 :
139 :
140 :
141 :
142 :
143 :
144 :
145 :
146 :
147 :
148 :
149 :
150 :
151 :
152 :
153 :
154 :
155 :
156 :
157 :
158 :
159 :
160 :
161 :
162 :
163 :
164 :
165 :
166 :
167 :
168 :
169 :
170 :
171 :
172 :
173 :
174 :
175 :
176 :
177 :
178 :
179 :
180 :
181 :
<Entity Name="Member" DataSourceName="DefaultDB" DataSourceURL="" MultiLanguage="false">
	<Property Key="MemberID" Required="true" Type="Normal" TypeOption="">
		<Database>
			<Column Name="MemberID" Type="int" Length="10" Default="" Attribute="unsigned zerofill" Null="false" Index="primary key" PrimaryKeyType="auto" />
		</Database>
		<Form Type="text">
		</Form>
		<TableDataConfig View="Normal" Class="" Style="">
			<Parameter Key="width" Value="120" />
		</TableDataConfig>
		<Comment></Comment>
	</Property>
	<Property Key="MemberFamilyName" Required="true" Type="Normal" TypeOption="" Lang="false">
		<Database>
			<Column Name="MemberFamilyName" Type="varchar" Length="90" Default="null" Attribute="" Null="false" Index="index" />
		</Database>
		<Form Type="text">
			<Parameters>
				<Parameter Key="size" Value="20" />
			</Parameters>
		</Form>
		<TableDataConfig View="Normal" Class="" Style="">
			<Parameter Key="IsLink" Value="true" />
			<Parameter Key="Path" Value="./view.php" />
			<Parameter Key="RelationKey" Value="MemberID" />
			<Parameter Key="Key" Value="MemberID" />
			<Parameter Key="KeyList" Value="MemberFamilyName,MemberFirstName" />
			<Parameter Key="width" Value="120" />
			<Parameter Key="Separator" Value=" " />
		</TableDataConfig>
		<Comment></Comment>
	</Property>
	<Property Key="MemberFirstName" Required="true" Type="Normal" TypeOption="" Lang="false">
		<Database>
			<Column Name="MemberFirstName" Type="varchar" Length="90" Default="null" Attribute="" Null="true" Index="index" />
		</Database>
		<Form Type="text">
			<Parameters>
				<Parameter Key="size" Value="20" />
			</Parameters>
		</Form>
		<Comment></Comment>
	</Property>
	<Property Key="MemberEMail" Required="true" Type="Normal" TypeOption="" Lang="false">
		<Database>
			<Column Name="MemberEMail" Type="varchar" Length="255" Default="" Attribute="" Null="false" Index="unique" />
		</Database>
		<Form Type="text">
			<Parameters>
				<Parameter Key="size" Value="30" />
				<Parameter Key="placeholder" Value="PH_EMail" />
			</Parameters>
			<Description Key="DESCRIPTION_EMAIL">
			</Description>
		</Form>
		<TableDataConfig View="Normal" Class="" Style="">
			<Parameter Key="width" Value="250" />
		</TableDataConfig>
		<Comment></Comment>
	</Property>
	<Property Key="MemberEMailConfirm" Required="true" Type="Confirm" TypeOption="" Lang="false">
		<Form Type="text">
			<Parameters>
				<Parameter Key="size" Value="30" />
				<Parameter Key="placeholder" Value="PH_EMail" />
			</Parameters>
			<Description Key="DESCRIPTION_EMAIL_CONFIRM">
			</Description>
		</Form>
		<Comment></Comment>
	</Property>
	<Property Key="MemberPassword" Required="true" Type="Normal" TypeOption="" Lang="false">
		<Database>
			<Column Name="MemberPassword" Type="varchar" Length="20" Default="" Attribute="" Null="false" Index="" />
		</Database>
		<Form Type="password">
			<Parameters>
				<Parameter Key="size" Value="10" />
			</Parameters>
			<Description Key="DESCRIPTION_PASSWORD">
				<Replace Key="min" Value="6" />
				<Replace Key="max" Value="20" />
			</Description>
		</Form>
		<Comment></Comment>
	</Property>
	<Property Key="MemberPasswordConfirm" Required="true" Type="Confirm" TypeOption="" Lang="false">
		<Form Type="password">
			<Parameters>
				<Parameter Key="size" Value="10" />
			</Parameters>
			<Description Key="DESCRIPTION_PASSWORD_CONFIRM">
			</Description>
		</Form>
		<Comment></Comment>
	</Property>
	<Property Key="MemberSex" Required="true" Type="Normal" TypeOption="" Lang="false">
		<Database>
			<Column Name="MemberSex" Type="smallint" Length="" Default="0" Attribute="unsigned" Null="false" Index="index" />
		</Database>
		<Form Type="radio">
			<Options>
				<Option Key="DefaultValue" Value="1" />
				<Option Key="DataSourceType" Value="Variable" />
				<Option Key="DataSource" Value="SEX" />
			</Options>
		</Form>
		<TableDataConfig View="Variable" Class="" Style="">
			<Parameter Key="width" Value="80" />
		</TableDataConfig>
		<Comment></Comment>
	</Property>
	<Property Key="MemberBirthday" Required="true" Type="Normal" TypeOption="" Lang="false">
		<Database>
			<Column Name="MemberBirthday" Type="date" Length="" Default="" Attribute="" Null="false" Index="index" />
		</Database>
		<Form Type="date">
			<Options>
				<Option Key="DefaultValue" Value="1977-01-01" />
			</Options>
		</Form>
		<TableDataConfig View="Normal" Class="" Style="">
			<Parameter Key="width" Value="100" />
		</TableDataConfig>
		<Comment></Comment>
	</Property>
	<Property Key="MemberZip" Required="false" Type="NumberJoint" TypeOption="2" Lang="false">
		<SubKey Value="MemberZip1" />
		<SubKey Value="MemberZip2" />
		<Parameter Key="Separator" Value="LABEL_HYPHEN" />
		<Database>
			<Column Name="MemberZip1" Type="char" Length="3" Default="null" Attribute="" Null="true" Index="index" />
			<Column Name="MemberZip2" Type="char" Length="4" Default="null" Attribute="" Null="true" Index="index" />
		</Database>
		<Form Type="text">
			<Options>
				<Option Key="Attribute" Value="size:1/minlength:3/maxlength:3|size:2/minlength:4/maxlength:4/onKeyUp:setAddress('inputForm', 'Member');" />
				<Option Key="Separator" Value="FORM_SEPARATOR_HYPHEN" />
			</Options>
		</Form>
		<Comment></Comment>
	</Property>
	<Property Key="MemberPrefecture" Required="true" Type="Normal" TypeOption="" Lang="false">
		<Database>
			<Column Name="MemberPrefecture" Type="smallint" Length="" Default="0" Attribute="unsigned" Null="true" Index="index" />
		</Database>
		<Form Type="select">
			<Options>
				<Option Key="Append" Value="MSG_PLEASE_CHOOSE" />
				<Option Key="SearchAppend" Value="LABEL_UNSELECTED" />
				<Option Key="DataSourceType" Value="Variable" />
				<Option Key="DataSource" Value="PREFECTURE" />
			</Options>
		</Form>
		<TableDataConfig View="Variable" Class="" Style="">
			<Parameter Key="width" Value="90" />
		</TableDataConfig>
		<Comment></Comment>
	</Property>
		:
		:
		:
	<Property Key="MemberShipping" Required="true" Type="Normal" TypeOption="" Lang="false">
		<Database>
			<Column Name="MemberShipping" Type="text" Length="" Default="null" Attribute="" Null="false" Index="" />
		</Database>
		<Form Type="class">
			<Options>
				<Option Key="Type" Value="Shopping" />
				<Option Key="Package" Value="member" />
				<Option Key="Class" Value="MemberShippingForm" />
			</Options>
		</Form>
		<Comment></Comment>
	</Property>
	<ViewConfig>
		<View Type="List" Kind="client/admin/member/index">
			<Parameter Key="Element" Value="table" />
		</View>
	</ViewConfig>
</Entity>
 

Property要素

このEntity要素の中に、会員ID、氏名、メールアドレス、パスワード、性別、生年月日、住所といった「項目=Property」が並び、それぞれの項目に対して

  • データベース上のカラム定義(Database)
  • 入力フォームの種類や属性(Form)
  • 一覧画面などでの表示設定(TableDataConfig)
  • 必要に応じた表示オプションや説明文(Parameters, Options, Description)
といった情報が一元的に記述されています。

 

Propertyごとに「DB」「フォーム」「一覧表示」を一括定義

例えば、会員IDであるMemberIDの定義では、

  • int(10) unsigned zerofillの主キーとして扱うこと
  • フォーム上ではtext入力として使うこと
  • 一覧表示用には幅120pxで表示すること
といった仕様が、ひとつのPropertyの中にまとまっています。

同じように、MemberFamilyNameやMemberFirstNameではテキストボックスのサイズや、一覧画面で氏名をリンクにするためのパラメータ(IsLink, Path, RelationKeyなど)が設定されており、「どの画面でどう表示され、どの値をキーにリンクするのか」までがXMLだけで完結しています。

 

Confirm項目や結合項目もXMLだけで表現

MemberEMailConfirmやMemberPasswordConfirmのような「確認用」入力は、データベースのカラムを持たず、Type="Confirm"としてフォーム側だけを定義しています。
これにより、「どの項目と照合するか」「どのバリデーションルールを適用するか」といったロジックをEntityValidation側と連携させつつ、画面定義はシンプルに保てます。

また、MemberZipはType="NumberJoint"として定義されており、郵便番号をMemberZip1とMemberZip2の2つのカラムに分けつつ、フォーム上ではひとつの項目として扱う構造になっています。

ここでは、

  • DB上は2カラム
  • 画面上は連結された1つの入力(ハイフン付き)
  • 入力完了時に住所自動補完処理を呼び出す
といった挙動を、すべてXMLレベルで表現しています。

 

マスタ連動や複合フォームも一元化

MemberSexやMemberPrefectureでは、ラジオボタンやセレクトボックスの選択肢を「DataSourseType」と「DataSrouce」といった形で外部のデータソース(例えば定数定義やマスタ)に紐付けています。
これにより、「性別マスタ」や「都道府県マスタ」を変更しても、EntityXMLを書き換えることなく選択肢を更新できるようになっています。

さらにMemberShippingのように、Form Type="class"とすることで、特定の項目だけを専用フォームクラス(Shopping/member/MemberShippingFormなど)に委譲し、複雑なUIや専用ロジックを組み込むことも可能です。

 

ViewConfigによる画面単位の設定

最後のViewConfigでは、どの画面(ここではclient/admin/member/index)で、どのような要素構造(Element="table")を用いて表示するのかを定義しています。

この設定と各PropertyのTableDataConfigが組み合わさることで、一覧画面が自動的に構成されます。

 

EntityコンフィグがCejunoの「核」である理由

このように、Entityコンフィグは

  • データベース構造
  • 入力フォームのレイアウトと振る舞い
  • 一覧画面での表示方法
  • マスタ連動や複合項目の扱い
  • 一部項目の専用フォームクラスへの委譲
といった情報を、ひとつの定義に統合しています。

Cejuno Frameworkにおいては、このEntityコンフィグが「情報の設計図」として機能し、WorkflowやTask、PageViewerと連携することで、DB定義から画面生成、業務処理までの大部分を自動化します。

つまり、

「Entityをどう設計するかが、そのままシステム全体の“情報構造”を決める」

と言ってよいほど、Cejuno FrameworkにおけるEntityは中核的な存在です。

 

他フレームワークとの違い

Cejuno Frameworkと他フレームワークの違いは、

”情報そのもの”を1つの場所で完全に定義できることです。

通常のフレームワークでは

  • DB定義
  • フォーム定義
  • 一覧表示の設定
  • バリデーション設定
  • ラベルやプレースホルダ
  • UIの振る舞い
がすべてバラバラのファイルやレイヤーに散らばります。

しかし、Cejuno Frameworkでは全てが1つのXML内にまとまっています。

これは“情報工学的にも”、“哲学的にも”正しく、

「情報の定義は1か所にあるべき」

この原則を実現したEntityは、まさに“核”となります。

また、他フレームワークとの大きな違いとして、DBとUIの乖離を完全にゼロにできるという特徴があります。

通常のフレームワークでは

  • DBカラムを変える
  • 入力フォームを直す
  • 一覧画面を直す
  • バリデーションを直す
と言った対応が必要となり、すべて別作業、しかも人的ミスが起きやすくなります。

しかし、Cejuno FrameworkのEntityでは、XMLの該当箇所を直すだけで、

  • DB
  • 入力フォーム
  • 表示
  • 検索
  • Task処理
  • PageViewer
など、一度で全てが同期される。という仕組みになっています。

これは“世界中のフレームワークが解決できていない問題”を、Cejuno Frameworkがあっさり突破している現実を意味します。

Previous Page <<
ページファイル
>> Next Page
DataAccessコンフィグ

ページナビ

  • HOME > 
  • 全ての記事 > 
  • Cejuno Framework内部処理の流れとコアアーキテクチャ概要