ZendFrameworkで作る『イマドキ』のWebアプリケーション

第5回 Zend Framework 1.8と新しいZend_Tool

この記事を読むのに必要な時間:およそ 7 分

zfコマンドで作成したプロジェクトの管理ファイル

コントローラとビューを作成する際に.zfproject.xmlファイルが更新されていることが分かります。これはプロジェクトの状態を保存するとともにプロジェクト内にどのようなコントローラ,アクション,ビューがあるか管理するファイルです。

.zfproject.xml

<?xml version="1.0"?>
<projectProfile>
  <projectDirectory>
    <projectProfileFile/>
    <applicationDirectory>
      <apisDirectory enabled="false"/>
      <configsDirectory>
        <applicationConfigFile type="ini"/>
      </configsDirectory>
      <controllersDirectory>
        <controllerFile controllerName="index">
          <actionMethod actionName="index"/>
        </controllerFile>
        <controllerFile controllerName="error"/>
        <controllerFile controllerName="foo">
          <actionMethod actionName="index"/>
          <actionMethod actionName="bar"/>
        </controllerFile>
      </controllersDirectory>
      <layoutsDirectory enabled="false"/>
      <modelsDirectory/>
      <modulesDirectory enabled="false"/>
      <viewsDirectory>
        <viewScriptsDirectory>
          <viewControllerScriptsDirectory forControllerName="index">
            <viewScriptFile forActionName="index"/>
          </viewControllerScriptsDirectory>
          <viewControllerScriptsDirectory forControllerName="error">
            <viewScriptFile forActionName="error"/>
          </viewControllerScriptsDirectory>
          <viewControllerScriptsDirectory forControllerName="foo">
            <viewScriptFile forActionName="index"/>
          </viewControllerScriptsDirectory>
(以下省略)

このファイルを見ると,レイアウトやモジュールディレクトリなど多くの設定項目があることが分かります。今後,zfコマンドがどのように拡張されていくのか予想できます。

今のところzfコマンドは単純なスケルトン作成コマンドでしかありませんが,Zend Frameworkを利用するならzfコマンドでプロジェクト,コントローラ,アクション,ビューを作成するほうがよいでしょう。

guestbookアプリの動作

Zend Framework 1.8.0は上位互換ですが,ゲストブックのように簡単なアプリケーションでもアップグレードには注意が必要です。

図7 仕様変更の予告エラー

図7 仕様変更の予告エラー

index.php/bootstrap.phpの入れ替え

1.8のzfコマンドが生成するpublic/index.phpとapplication/bootstrap.phpのコードが変わり,クラス自動ロードの方法が変更されるのでエラーが発生しています。

1.7のindex.php

<?php
// @see application/bootstrap.php
$bootstrap = true;
require '../application/bootstrap.php';

// $frontController is created in your boostrap file. Now we'll dispatch it, which dispatches your application.
$frontController->dispatch();

1.7のbootstrap.php

<?php
// ** Check to see if the environment is already setup **
if (isset($bootstrap) && $bootstrap) {
    // Enable all errors so we'll know when something goes wrong.
    error_reporting(E_ALL | E_STRICT);
    ini_set('display_startup_errors', 1);
    ini_set('display_errors', 1);

    // Add our  directory to the include path so that PHP can find the Zend Framework classes.
    // you may wish to add other paths here, or keep system paths: set_include_path('../library' . PATH_SEPARATOR . get_include_path()
    set_include_path('../library');

    // Set up autoload.
    // This is a nifty trick that allows ZF to load classes automatically so that you don't have to litter your
    // code with 'include' or 'require' statements.
    require_once "Zend/Loader.php";
    Zend_Loader::registerAutoload();
}

// ** Get the front controller **
// The Zend_Front_Controller class implements the Singleton pattern, which is a design pattern used to ensure
// there is only one instance of Zend_Front_Controller created on each request.
$frontController = Zend_Controller_Front::getInstance();

// Point the front controller to your action controller directory.
$frontController->setControllerDirectory('../application/controllers');

// Set the current environment
// Set a variable in the front controller indicating the current environment --
// commonly one of development, staging, testing, production, but wholly
// dependent on your organization and site's needs.
$frontController->setParam('env', 'development');

1.8のコードでは初期化の多くがindex.phpに移動され,bootstrap.phpには空のクラスだけが定義されています。BoostrapクラスはZend Applicationから自動的に読み込まれるようになっています。また,アプリケーションの実行環境は環境変数から取得されるように変更されています。

1.8のindex.php

<?php

// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));

/** Zend_Application */
require_once 'Zend/Application.php';

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap()
            ->run();

1.8のbootstrap.php

<?php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{


}

Zend Framework 1.8でguestbook2アプリを動作させるためには,新しいzfコマンドで生成したpublic/index.php,application/bootstrap.phpをコピーし,library/Zendを削除し,新しいZend Frameworkのライブラリにアクセスできるようにするだけです。

動作環境の設定

1.7のzfコマンドで生成したプロジェクトでは,動作環境がbootstrap.phpにハードコードされていましたが,1.8のzfコマンドではAPPLICATION_ENV環境変数で動作環境を設定できるようになりました。デフォルトの動作環境はproductionに設定されているので,エラーページに詳細なエラー情報が表示されなくなります。

Apacheの場合,環境変数はmod_envモジュールのsetEnvディレクティブで設定できます。httpd.confの最後に※1

SetEnv APPLICATION_ENV development

を追加してWebサーバを再起動します※2⁠。

これでエラーページに詳細なエラー情報は表示されるべきなのですが,viewオブジェクトのenvに動作環境が設定されていません。APPLICATION_ENV定数はindex.phpで定義済みなのでviewオブジェクトの$this->envの代わりにAPPLICATION_ENV定数を利用すると詳細なエラーが表示できるようになります※3⁠。

図8 必要な修正を終えた後のエラーページ

図8 必要な修正を終えた後のエラーページ
※1

sudo vi /opt/PostgreSQL/EnterpriseDB-ApachePhp/apache/conf/httpd.conf で編集。

※2

sudo /etc/init.d/EnterpriseDBApachePhp restart で再起動。

※3

この状態はバグだと思われます。次回のリリースには修正されているでしょう。

まとめ

目立った機能追加などはありませんが,zfコマンドの仕様はプレビュー版と随分異なります。変更された部分はよい変更だと言えると思います。public/index.phpに基本設定を持たせ,Zend Applicationからアプリケーションがブートストラップコードを読み込む変更,APPLICATION_ENV環境変数から動作環境を設定できるように変更されたのでプロダクションサーバへのデプロイメントも容易になりました。

今後は新しいzfコマンドを使ってアプリケーションを構築していきます。

著者プロフィール

大垣靖男(おおがきやすお)

University of Denver卒。同校にてコンピュータサイエンスとビジネスを学ぶ。株式会社シーエーシーを経て,エレクトロニック・サービス・イニシアチブ有限会社を設立。
オープンソース製品は比較的古くから利用し,Linuxは0.9xのころから利用している。オープンソースシステム開発への参加はエレクトロニック・サービス・イニシアチブ設立後から。PHPプロジェクトでは,PostgreSQLモジュールのメンテナンスを担当している。

URLhttp://blog.ohgaki.net/

著書