前回はただファイルを作り配置して、埋め込みの「Hello world!」を表示させただけでした。
これではデータの流れが掴めません。
まずは文字列データをビューで描画させることを考えていきます。
実はアクションコントローラにあるデータを、ビューが描画に使えるように渡す仕組みが用意されています。
アクションコントローラ - IndexController.php
ビュースクリプト - index.phtml
このようにアクション側「$this->view->変数名」とスクリプト側「$this->変数名」が同じ名前空間になっています。
この仕組みを利用すればアクション側データを使って自由自在に描画できます。
これで一見解決したかに見えましたが、まだ「モデル」を使っていません!
前回書いたように「モデル」の仕事はデータの出し入れです。
そう考えると「Hello world!」だってデータです。これはモデルから取得するべきでしょう。
なのでアクションコントローラには、モデルに対してデータを要求する指示を書くべきです。
ではモデルのデータ出し入れクラスを書いてみます。
モデル - IndexData.php
アクションコントローラを書き変えてみます。
アクションコントローラ - IndexController.php
作成したモデルを呼ぶためにdirname(__FILE__)を使っています。定石の記述方法です。
PHP5.3.0からは__DIR__が使えますが、ツウはdirname(__FILE__)を使います。
モデルが増えたので一応ファイル配置を書いておきます。
ファイル配置
アクションで最終的に「$this->view->message」にセットしているのでビュースクリプトは上記のものをそのまま使えます。
ベースURLにアクセスしてみて「Hello world!」が表示されればOKです。
単に「モデル」の分だけファイル数が増えた形になったように見えますが、もしデータの取得先がファイルになった場合はモデルのgetMessage()メソッドを修正すれば済むことになります。
データベースから取得するにしても同様にgetMessage()メソッド修正で済みます。
このことはアクションコントローラに「Hello world!」を直接書いた場合でも言えることですが、アクションコントローラにはいろんな機能のアクションが羅列することになります。なのでできるだけコンパクトに指示だけを書いてできるだけ修正が発生しないようにするのが理想だと思います。
データの出し入れを機能別にモデル分けすることにより、特定のデータ出し入れ方法に変更が発生した場合によりコンパクトな修正で済むというのが私の見解です。
ファイル数は増えたけど、それに余りある大規模システム構築MVCの礎が完成したと言えるんじゃないでしょうか。
とは言っても、まだ足りない部分がいくつかあります。
エラー処理、ビューでサニタイズ、日本語を扱う方法、自作クラス呼び出しの工夫など・・
それが済んだら、なぜIndexController.phpというファイル名で作成したのか? などの命名規則やいろいろなアクション呼び出しなどへ進んで行きたいと思います。
これではデータの流れが掴めません。
まずは文字列データをビューで描画させることを考えていきます。
実はアクションコントローラにあるデータを、ビューが描画に使えるように渡す仕組みが用意されています。
アクションコントローラ - IndexController.php
<?php
require_once 'Zend/Controller/Action.php';
class IndexController extends Zend_Controller_Action
{
public function indexAction() {
$this->view->message = 'Hello world!';
}
}
require_once 'Zend/Controller/Action.php';
class IndexController extends Zend_Controller_Action
{
public function indexAction() {
$this->view->message = 'Hello world!';
}
}
ビュースクリプト - index.phtml
<html>
<body>
<?php echo $this->message;?>
</body>
</html>
<body>
<?php echo $this->message;?>
</body>
</html>
このようにアクション側「$this->view->変数名」とスクリプト側「$this->変数名」が同じ名前空間になっています。
この仕組みを利用すればアクション側データを使って自由自在に描画できます。
これで一見解決したかに見えましたが、まだ「モデル」を使っていません!
前回書いたように「モデル」の仕事はデータの出し入れです。
そう考えると「Hello world!」だってデータです。これはモデルから取得するべきでしょう。
なのでアクションコントローラには、モデルに対してデータを要求する指示を書くべきです。
ではモデルのデータ出し入れクラスを書いてみます。
モデル - IndexData.php
<?php
class IndexData
{
public function getMessage() {
return 'Hello world!';
}
}
class IndexData
{
public function getMessage() {
return 'Hello world!';
}
}
アクションコントローラを書き変えてみます。
アクションコントローラ - IndexController.php
<?php
require_once 'Zend/Controller/Action.php';
class IndexController extends Zend_Controller_Action
{
public function indexAction() {
require_once dirname(__FILE__) . '/../models/IndexData.php';
$obj = new IndexData;
$this->view->message = $obj->getMessage();
}
}
require_once 'Zend/Controller/Action.php';
class IndexController extends Zend_Controller_Action
{
public function indexAction() {
require_once dirname(__FILE__) . '/../models/IndexData.php';
$obj = new IndexData;
$this->view->message = $obj->getMessage();
}
}
作成したモデルを呼ぶためにdirname(__FILE__)を使っています。定石の記述方法です。
PHP5.3.0からは__DIR__が使えますが、ツウはdirname(__FILE__)を使います。
モデルが増えたので一応ファイル配置を書いておきます。
ファイル配置
Zend/
application/
models/
IndexData.php
views/
scripts/
index/
index.phtml
controllers/
IndexController.php
htdocs/
.htaccess
index.php
application/
models/
IndexData.php
views/
scripts/
index/
index.phtml
controllers/
IndexController.php
htdocs/
.htaccess
index.php
アクションで最終的に「$this->view->message」にセットしているのでビュースクリプトは上記のものをそのまま使えます。
ベースURLにアクセスしてみて「Hello world!」が表示されればOKです。
単に「モデル」の分だけファイル数が増えた形になったように見えますが、もしデータの取得先がファイルになった場合はモデルのgetMessage()メソッドを修正すれば済むことになります。
データベースから取得するにしても同様にgetMessage()メソッド修正で済みます。
このことはアクションコントローラに「Hello world!」を直接書いた場合でも言えることですが、アクションコントローラにはいろんな機能のアクションが羅列することになります。なのでできるだけコンパクトに指示だけを書いてできるだけ修正が発生しないようにするのが理想だと思います。
データの出し入れを機能別にモデル分けすることにより、特定のデータ出し入れ方法に変更が発生した場合によりコンパクトな修正で済むというのが私の見解です。
ファイル数は増えたけど、それに余りある大規模システム構築MVCの礎が完成したと言えるんじゃないでしょうか。
とは言っても、まだ足りない部分がいくつかあります。
エラー処理、ビューでサニタイズ、日本語を扱う方法、自作クラス呼び出しの工夫など・・
それが済んだら、なぜIndexController.phpというファイル名で作成したのか? などの命名規則やいろいろなアクション呼び出しなどへ進んで行きたいと思います。