somemo programming etc.

プログラマ、雑記、プログラミング関係はLinkから、数式はこっちでまとめていることが多い

【Zendframework】ディレクトリ構成とクイックスタート

Zend Framework: Documentation: Zend_Application クイックスタート - Zend Framework Manualを参考にプロジェクトを作成します。

プロジェクトを作成

プロジェクトを作成するためのツールZend_Toolを使用します。Zendframeworkのbinディレクトリにあるzf.batのことです。(Linuxではzf.shです。)今回は、zendという名前プロジェクトを作成します。

cd C:\xampp\htdocs
zendframeworkのディレクトリ\bin\zf.bat create project zend

Creating project at C:/xampp/htdocs/zend
Note: This command created a web project, for more information setting up your VHOST, please see docs/README

下記のようなディレクトリ構造ができあがります。リファレンスから引用

    zend
    |-- application
    |   |-- Bootstrap.php
    |   |-- configs
    |   |   `-- application.ini
    |   |-- controllers
    |   |   |-- ErrorController.php
    |   |   `-- IndexController.php
    |   |-- models
    |   `-- views
    |       |-- helpers
    |       `-- scripts
    |           |-- error
    |           |   `-- error.phtml
    |           `-- index
    |               `-- index.phtml
    |-- library
    |-- public
    |   `-- index.php
    `-- tests
        |-- application
        |   `-- bootstrap.php
        |-- library
        |   `-- bootstrap.php
        `-- phpunit.xml

zend/publicがドキュメントルート扱いで、index.phpがフロントコントローラーです。

しかし、1.8?からはフロントコントローラー内でフロントコントローラーを直接呼ぶのではなく、DIのできるZend_Aplicationを呼び出すようになっています。それまでは、フロントコントローラーに設定を追加していましたが、設定ファイルを通して追加していきます。また、設定ファイルは分類可能らしいです。

設定ファイルは以下の形式です。(zend/application/configs/application.ini)

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"

[staging : production]
…

zendのConfig_Iniクラスで扱えるiniファイル形式で記述されています。他にもXML、JSON、YAMLPHP構成ファイルも同様に利用できますとのことです。実際に扱ったことがあるのは、この形式しかありません・・・。また、stagingのように各環境ごとにも使えるみたいですし、定数も使えるようです。

iniファイルに、プロジェクトの初期設定を記述していくことで、設定の脱着が可能になります。コードを変更せずに設定だけを変更できることは、魅力的です。

Indexコントローラーとビュー

プロジェクト作成後に、遷移できるページには以下の2つあります。

1つはIndexです。今回の例だと、以下のURLでアクセスできます。

上から順に上記のリストと対応しています。

  • htaccessにより、index.phpに書き換えられている
  • ZendFrameworkの仕様により、Indexコントローラーのindexアクションの処理を行う
  • Indexコントローラーのアクション指定が無いので、indexアクションの処理を行う
  • Indexコントローラーのindexアクション指定

コントローラーを束ねているモジュールがあるようですが、またあとでまとめます。

上記は、「zend/application/controllers/IndexController.php の indexActionメソッド」を実行しています。

これに対応する表示部分は、「zend/application/views/scripts/index/index.phtml」です。

上記は、「zend/application/controllers/IndexController.php の indexActionメソッド」を実行しています。これに対応する表示部分は、「zend/application/views/scripts/index/index.phtml」です。

コントローラー名とアクション名に対応しています。ファイルの拡張子「phtml」は変更できると思います。以前にビューをsmartyで行っていたときは「html」でした。

Errorコントローラーとビュー

以下のようなエラーが発生したときにデフォルトでここのerrActionが実行されます。

  • コントローラーが無いとき(Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER)
  • アクションが無いとき(Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION)
  • ルーティング(URLに対応するコントローラーとアクションの組み合わせ)が無いとき(Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE)
  • (うろ覚えですが)アクションが無かったときには、マジックメソッド__callが呼ばれるんですが、それもなかったとき

また、エラーのメッセージを出す際には下記のように表示しています。

// デフォルトのもの
$this->view->message = 'You have reached the error page';
echo $this->message;

// こっちでもできます。smarty使ったときはこっちを使い、$thisなしで呼んでいました。
$this->view->assign('testMessage', 'testMessage');
echo $this->testMessage;

エラーのハンドリングには、ログを出力する機能もあるようです。ブートストラップから、ログのリソースがあるかを確かめ、存在している場合にはログ用オブジェクトを返します。application.iniによるDIがいたるところにありますね。

ビューとエラーのハンドリングはDispatchする際に設定してあるかどうかで、ルールが変わるようです。(noErrorHandler, noViewRendererが設定されている, またはそれぞれのプラグインが独自に設定してあるか)

レイアウト

application.iniの[production]に下記のレイアウトに関する設定を追加します。

; ADD THE FOLLOWING LINES
resources.layout.layout = "layout"
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"

この状態でindex/indexにアクセスすると真っ白な画面が表示されます。これは、レイアウト設定が有効になっている状態です。

次に、レイアウトに必要となるapplication/layouts/scripts/ディレクトリ、及びそのディレクトリ内にlayout.phtmlファイルを作成します。下記はlayout.phtmlの内容です。

<?php echo $this->doctype() ?>
<html>
<head>
    <?php echo $this->headTitle() ?>
    <?php echo $this->headLink() ?>
    <?php echo $this->headStyle() ?>
    <?php echo $this->headScript() ?>
</head>
<body>
    <?php echo $this->layout()->content ?>
</body>
</html>

再びindex/indexにアクセスすると前と同じWelcome画面が表示されます。これは、layout.phtmlの記述によりbody部分が表示されるようになっています。また、ドキュメントタイプやhtmlタグ、headタグなども表示されています。

最後に、ブートストラップにビューの初期設定をします。プロジェクト名\application\Bootstrap.phpで、ドキュメントタイプの設定やタイトルなどを設定できます。

<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initView()
    {
        // ビューを初期化します
        $view = new Zend_View();
        $view->doctype('XHTML1_STRICT');
        $view->headTitle('My First Zend Framework Application');
 
        // それを ViewRenderer に追加します
        $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper(
            'ViewRenderer'
        );
        $viewRenderer->setView($view);
 
        // ブートストラップで保存できるように返します
        return $view;
    }
}

とりあえずここまで。チュートリアルが疎結合で困る!

参考