Mojavi 初心者講座 基本
概要
- mojaviとは
- mojaviはMVC model2に基づいて作られたPHPのフレームワークです。
- MVCとは
- MVCとは、プログラムを、MODEL(ロジック)、VIEW(表示)、CONTROL(制御)の三つの部品に分離し、分業、再利用性、保守性の効率化を図る一連のプログラム構築手法です。
- mojavi3
- Mojaviについての解説は最新バージョンであるMojavi3をベースにしてます。弊社ではMojaviをフレームワークとして利用しております。
例えば、index.phpというファイルに、データベース接続、クエリ、表示ロジック、HTMLを全て書いたとします。これには以下のような問題があります。
- 【分業】
- 一つのファイルでは複数人で同じファイルを編集すると、整合性が保てなくなります。
- 【再利用性】
- 一つのファイルに関数などの部品をでたらめに詰め込むと、特定の一つの関数を他のプログラムで利用する場合に、ファイルごと余計なコードまでインクルードする必要があり、また、プログラムに一定の規則が適用されていないので、再利用はほぼ不可能です。よって、また新しくプログラムを書くごとに同じ関数を書くことになり、時間の浪費になります。
- 【保守性】
- 一つのファイルにプログラムを詰め込むと、どこにどの部品があるのか分かりづらくなり、また、一定のルールに基づいて書いていない場合、製作者の意図がわかりづらく、時間が経過した後や、 他者による修正、追加が困難になります。
MVCでは、ロジック、表示、制御の三部分を別の人間が作業することを想定してプログラムを構築します。これは以下のようにして行われます。
- ●MODEL(ロジック)
- データベースの操作や計算などのビジネスロジックを書きます。一般レベルのプログラマが担当します。
- ●VIEW(表示)
- HTMLファイルなど、表示部分を書きます。HTMLコーダーや一般プログラマが担当します。
- ●CONTROL(制御)
- MODELとVIEWの連結、設定ファイルの適用など、全てに共通する基盤部分を書きます。システム設計をするプログラマが担当します。
これにより、以下のことが実現できます。
- 【分業】
- 技能による完全な分業が可能。
- 【再利用性】
- 複数ファイルが機能ごとに一定の規則に基づいて分離されているので、簡単な再利用が可能。
- 【保守性】
- 複数ファイルが機能ごとに一定の規則に基づいて分離されているので、簡単な修正、追加が可能。
mojaviのMVC
mojaviではMODEL、VIEW、CONTROLを以下のように分離しています。
- 【MODEL】action, view
- 【VIEW】view, template
- 【CONTROL】controller, filter,
viewクラスは表示に直接関連するロジックを書き込みますが、MODELと定義できるかもしれません。さらに、mojaviでは、全てがオブジェクト指向となり、あらゆる値がオブジェクトに内包され、再利用性が高まっています。
また、mojavi には以下のような特徴があります。
- 【contextクラス】GET/POSTやセッションなどの値を保持するオブジェクトを統合するオブジェクトです。
- 【filter】フィルタというクラスを使用することで、様々な設定を適用することができます。
ディレクトリ構造
ディレクトリ構造は以下のようになっており、基本的に編集する必要のある部分はごく一部です。
- 【www】mojaviの全てが始まるindex.phpが格納されます。
- 【mojavi】基盤になるクラス郡がここに入ります。基本的に関知する必要はありません。
- 【webapp】この下に【modules】と【template】ディレクトリが入ります。
- 【modules】プログラマの主な作業場となるモジュールディレクトリが入ります。
- 【モジュール名】
- 【actions】入力などのビジネスロジックを書きます。
- 【views】表示に関するロジックを書きます。
- 【モジュール名】
- 【template】コーダーの主な作業場となるHTMLテンプレートが入ります。
- 【modules】プログラマの主な作業場となるモジュールディレクトリが入ります。
モジュール作成
mojaviにはモジュールとアクションというコンセプトがあり、それぞれをURL内で指定することで、特定のページを表示するような仕組みなっています。 例えば、
index.php?module=Test&action=Index
の場合、Testモジュール内のIndexアクションが実行されます。以下ではこの過程を更に詳細に解説します。
一つのページを表示するのに編集する必要があるファイルは基本的に以下の四つだけで、プログラムは上から下へと流れて行きます。
【modules】 【モジュール名】 【config】module.ini 【actions】xxxAction.class.php 【views】xxxView.class.php 【template】xxx.html
MODULE.iniの設定
まずモジュールの設定をします。モジュール名はTestとします。 modulesディレクトリ以下にTestディレクトリを作ります。
【modules】 【Test】←
この中にconfigというディレクトリを作成し、中にmodule.iniというファイルを作成します。
【modules】 【Test】 【config】module.ini
module.iniに書く必要があるのは以下の三つだけです。
[module] ENABLED = "On" NAME = "Test"
これで、Testといモジュールを使用可能に設定しました。
アクション作成
アクションには形式では入力関係のロジックを書くのでフォームの入力が無い場合は何もする必要がありません。
まず、Test以下にactionsディレクトリを作成します。
【modules】 【Test】 【config】module.ini 【actions】←
ファイル名は
アクション名Action.class.php
となります。
クラス名は、
モジュール名_アクション名Action
となります。
アクションはURLでactionを指定しないとIndexになるので、今回はIndexのアクションであるIndexAction.class.phpを作ることにします。
モジュール名がTestだとすると、IndexAction.class.phpは以下のようになります。
class Test_IndexAction extends Action{ public function execute(){ return View::SUCCESS; } }
execute()は単体だと必ず実行されます。
execute()内のreturn View::SUCCESS;はSUCCESSというビュー名を返すという意味を表します。
ビュー名については次の項で説明します。
ビュー作成
ビューには表示に関連するロジックを書きます。
まず、Test以下にviewsディレクトリを作成します。
【modules】 【Test】 【config】module.ini 【actions】IndexAction.class.php 【views】←
ファイル名は
アクション名ビュー名View.class.php
となります。
クラス名
モジュール名_アクション名ビュー名View
となります。さて、ここで言うビュー名とは、アクションで指定するもので、今回はアクションでビュー名をSUCCESSと指定したので、クラス名は
IndexSuccessView
となります。ビュー名については後ほど解説します。
IndexInputViewは以下のように書きます。
class Test_IndexSuccessView extends PHPView{ public function execute(){ $this->setDirectory( MO_WEBAPP_DIR.'/templates/Test' ); $this->setTemplate( 'IndexSuccessView.html' ); $var = 'tester'; $this->setAttribute( 'name', $var ); } }
今回はViewクラスを継承したPHPViewを継承しました。場合によってはテンプレートエンジンのSmartyを使うSmartyViewなどを使うことも可能です。
execute()内にロジックを書きます。
setDirectoryはテンプレートHTMLが入っているディレクトリを設定します。MO_WEBAPP_DIRは、【modules】の一つ上のディレクトリとなります。
setTemplate()はテンプレートHTMLのファイル名を設定します。。
ここにある
$this->setAttribute( 'name', $var )
とは、HTMLテンプレートで使う変数を定義しています。
これは、$varに入った値(tester)を’name’というキーに代入する、ということを意味します。
こうすることで、HTMLテンプレートファイルで、testerという文字列が入った$template[‘name’]という変数を使用することが出来ます。
テンプレート作成
テンプレートは、templates以下に置きます。
【modules】 【Test】 【config】module.ini 【actions】IndexAction.class.php 【views】IndexSuccessView.class.php 【templates】←
テンプレートの名前は、基本的に自由ですが、アクション名とビュー名を含めて見やすくしたほうが良いかもしれません。
ここではIndexSuccess.htmlとします。
内容は以下のように書きます。
名前: <?= $template['name'] ?>
これで結果は以下のようになります。
名前:tester