【PHP】【Zend Framework】Controller で Hello World

サンプル

フォルダ構成

「*」は、フォルダの意味で、付いてなければ、ファイルを意味する
 * アプリケーションのルートディレクトリ
 |
 +- * public(公開用ディレクトリ)
 |  +- .htaccess
 |  +- index.php
 |
 +- * application(MVCアプリケーションのフォルダ・ファイルを格納するためのディレクトリ)
    +- * controllers(コントローラ関係のファイルを格納するためのディレクトリ)
       |
       +- IndexController.php

【1】.htaccess の作成

RewriteEngine on
RewriteRule !\.(js|ico|gif|jpg|jpeg|png|css|htm|html)$ index.php

説明

* 拡張子が(js|ico|gif|jpg|jpeg|png|css|htm|html)のファイルでアクセスされた場合、全てindex.phpとみなしてしまうようにしている

目的

* index.phpで一括で制御したいため

他の参考資料

http://d.hatena.ne.jp/koto2/20080630/1214817129

【2】フロントコントローラ(index.php)の作成

[a] すべてのリクエストはまず index.php に受けつけられる
[b] そこで必要となる処理が判断されると、該当する「アクションコントローラ」が決定され、以後の処理が受け渡される
<?php
require_once 'Zend/Controller/Front.php'; /* (1)参照 */
Zend_Controller_Front::getInstance()->setParam('noViewRenderer', true); /* (2)参照 */
Zend_Controller_Front::run('../application/controllers'); /* (3)参照 */
ini_set( 'display_errors', true); /* (4)参照 */

(1) フロントコントローラ用のコンポーネントの呼び出し

* index.phpは、正確にはフロントコントローラではなく、『フロントコントローラを実行するためのファイル』である
* そのため、1行目で、Zend/Controller/Front.phpを呼び出している

require_once 'Zend/Controller/Front.php';

(2) 自動描画モードの設定

* 自動描画モードをOffにする

Zend_Controller_Front::getInstance()->setParam('noViewRenderer', true);

(3) フロントコントローラのインスタンスの取得

* 2行目では、コントローラのフォルダ指定('./application/controllers')して、ディスパッチ(指定した先に制御を委ねる)をしている

Zend_Controller_Front::run('./application/controllers');

(4) エラー表示の設定(オプション・任意)

* エラーを表示するかを指定している
* 省略可能

ini_set('display_errors', true);

補足:閉じタグ( ?> )がないことについて

* 結論から言うと、Zend Framework特有のもので、わざと。
* つけると害がある(例:閉じタグの後に改行があると改行文字を出力してしまう等)かもしれないので注意

【3】コントローラの作成

IndexController.php

<?php
require_once 'Zend/Controller/Action.php';

class IndexController extends Zend_Controller_Action {

	//デフォルトのアクションメソッド
	public function indexAction()
	{
		echo "Hello World!";
	}
}

構文

class 【コントローラ名】Controller extends Zend_Controller_Action
{
    public function 【アクション名】Action()
    {
        // 行いたい処理
    }
}

アクションコントローラ要素の命名規則

ファイル名:<コントローラ名(最初のみ大文字)>Controller.php
クラス名:<コントローラ名(最初のみ大文字)>Controller
アクションメソッド名:<アクション名(すべて小文字)>Action

補足:extends Zend_Controller_Action について

* Zend_Controller_Actionクラスに、コントローラの基本的な機能が実装されているため、コントローラはこのクラスを継承している