<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<!-- EN-Revision: 24249 -->
<appendix id="project-structure">
    <title>Zend Framework MVC アプリケーションのために推奨されるプロジェクト構造</title>

    <sect1 id="project-structure.overview">
        <title>概要</title>

        <para>
            たくさんの開発者が、比較的柔軟な環境でZend Frameworkプロジェクトのための
            最善のプロジェクト構造のガイダンスを望みます。
            「柔軟な」環境とは、
            それらのアプリケーションを実行し、かつ安全にするための
            最も理想的なプロジェクト構造を達成するために、
            必要に応じてそれらのファイルシステムとウェブサーバ構成を開発者が操作できる
            環境です。
            デフォルトのプロジェクト構造では、
            それらの配置で開発者がそのような柔軟性を持つと仮定します。
        </para>

        <para>
            以下のディレクトリ構造は、
            複雑なプロジェクトのために最大限に拡張可能に設計されています。
            その一方で、プロジェクトのためのフォルダとファイルの単純なサブセットを
            より単純な必要条件で提示します。
            この構造も、モジュラー及び非モジュラー両方のZend Frameworkアプリケーションのために、
            変更なしで動作します。
            <filename>.htaccess</filename>ファイルは、
            この付録に含まれる<link linkend="project-structure.rewrite">リライト構成ガイド</link>
            で定めるウェブサーバでも、<acronym>URL</acronym>リライト機能を必要とします。
        </para>

        <para>
            このプロジェクト構造で、可能性があるすべてのZend Frameworkプロジェクト条件を
            サポートすることは意図していません。
            <classname>Zend_Tool</classname>によって使われるデフォルトのプロジェクト・プロフィールは、
            このプロジェクト構造を反映します。
            しかし、この構造でサポートされない必要条件を持つアプリケーションでは、
            カスタム・プロジェクト・プロフィールを使わなければなりません。
        </para>
    </sect1>

    <sect1 id="project-structure.project">
        <title>推奨されるプロジェクト・ディレクトリ構造</title>

        <programlisting language="text"><![CDATA[
<project name>/
    application/
        configs/
            application.ini
        controllers/
            helpers/
        forms/
        layouts/
            filters/
            helpers/
            scripts/
        models/
        modules/
        services/
        views/
            filters/
            helpers/
            scripts/
        Bootstrap.php
    data/
        cache/
        indexes/
        locales/
        logs/
        sessions/
        uploads/
    docs/
    library/
    public/
        css/
        images/
        js/
        .htaccess
        index.php
    scripts/
        jobs/
        build/
    temp/
    tests/
]]></programlisting>

        <para>
            以下では、一覧に記載されたディレクトリ毎に利用例を記述します。
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <emphasis><filename>application/</filename></emphasis>:
                    このディレクトリは、アプリケーションを含みます。
                    構成や利用されるサービス、及びブートストラップ・ファイルと同様に、
                    <acronym>MVC</acronym>システムを収納します。
                </para>

                <itemizedlist>
                    <listitem>
                        <para>
                            <emphasis><filename>configs/</filename></emphasis>:
                            アプリケーション全体の設定のディレクトリ
                        </para>
                    </listitem>

                    <listitem>
                        <para>
                            <emphasis><filename>controllers/</filename></emphasis>,
                            <emphasis><filename>models/</filename></emphasis>,
                            <emphasis><filename>views/</filename></emphasis>:
                            これらのディレクトリは、デフォルトのコントローラ、モデルまたは
                            ビューのディレクトリとして用いられます。
                            アプリケーション・ディレクトリの中にこれらの３つのディレクトリを持たせると、
                            グローバルな <filename>controllers/models/views</filename> を持つ
                            モジュラー・プロジェクトと同様に、
                            単純なプロジェクトを始めるための最良のレイアウトが提供されます。
                        </para>
                    </listitem>

                    <listitem>
                        <para>
                            <emphasis><filename>controllers/helpers/</filename></emphasis>:
                            これらのディレクトリにはアクション・ヘルパーを含みます。
                            アクション・ヘルパーは、デフォルト・モジュールのための
                            "<classname>Controller_Helper_</classname>"、
                            または他のモジュールの "&lt;Module&gt;_Controller_Helper" として
                            <!-- TODO -->namespace
                            されます。
                        </para>
                    </listitem>

                    <listitem>
                        <para>
                            <emphasis><filename>layouts/</filename></emphasis>:
                            このレイアウト・ディレクトリは、 <acronym>MVC</acronym> ベースのレイアウト用です。
                            <classname>Zend_Layout</classname> は <acronym>MVC</acronym> ベース、
                            及び非 <acronym>MVC</acronym> ベースのレイアウトができるので、
                            このディレクトリの位置は、レイアウトがコントローラとは１対１の関係ではなく、
                            <filename>views/</filename> 内のテンプレートから独立していることを反映します。
                        </para>
                    </listitem>

                    <listitem>
                        <para>
                            <emphasis><filename>modules/</filename></emphasis>:
                            モジュールにより、開発者は
                            一組の関連したコントローラを論理的に系統化されたグループに分類できます。
                            モジュール・ディレクトリ配下の構造は、
                            アプリケーション・ディレクトリ配下の構造に似ています。
                        </para>
                    </listitem>

                    <listitem>
                        <para>
                            <emphasis><filename>services/</filename></emphasis>:
                            このディレクトリは、
                            アプリケーションによって、
                            またはモデルのための<ulink
                                url="http://www.martinfowler.com/eaaCatalog/serviceLayer.html">サービス・レイヤ</ulink>
                            を実装するために提供される、
                            アプリケーションに依存したウェブ・サービス・ファイルのためのものです。
                        </para>
                    </listitem>

                    <listitem>
                        <para>
                            <emphasis><filename>Bootstrap.php</filename></emphasis>:
                            このファイルはアプリケーションのためのエントリ・ポイントで、
                            <classname>Zend_Application_Bootstrap_Bootstrapper</classname> を実装するべきです。
                            このファイルのための目的は、アプリケーションを起動すること、
                            及びそれらを初期化することによって、コンポーネントがアプリケーションを利用できるようにすることです。
                        </para>
                    </listitem>
                </itemizedlist>
            </listitem>

            <listitem>
                <para>
                    <emphasis><filename>data/</filename></emphasis>:
                    このディレクトリは、
                    揮発性でおそらく一時的なアプリケーションのデータを格納するための場所を提供します。
                    このディレクトリのデータの障害は、アプリケーションが失敗する原因になるかもしれません。
                    また、このディレクトリの情報は、サブバージョン・リポジトリに関与するかもしれませんし、
                    関与しないかもしれません。
                    このディレクトリの物体の例は、
                    セッション・ファイル、キャッシュ・ファイル、sqlite データベース、
                    そしてログとインデックスです。
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis><filename>docs/</filename></emphasis>:
                    このディレクトリは、生成されたか、または直接編集された
                    ドキュメンテーションを含みます。
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis><filename>library/</filename></emphasis>:
                    このディレクトリは、アプリケーションが依存する共通ライブラリのため、
                    <acronym>PHP</acronym> <property>include_path</property> 上になければなりません。
                    開発者は、 <acronym>PHP</acronym> のマニュアル（ゼンド自体によって確立されるそれらだけでなく）の
                     <ulink url="http://www.php.net/manual/ja/userlandnaming.php">ユーザレベルでの命名の
                        手引き</ulink> に沿って、一意の名前空間内のこのディレクトリ配下に
                    それらのアプリケーション・ライブラリーのコードを置かなければなりません。
                    このディレクトリは、 Zend Framework 自体も含むかもしれません。
                    もしそうなら、それを <filename>library/Zend/</filename> にしまうでしょう。
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis><filename>public/</filename></emphasis>:
                    このディレクトリは、アプリケーションのためにすべての公開ファイルを含みます。
                    <filename>index.php</filename> は <classname>Zend_Application</classname> をセットアップして、実行します。
                    そして、それは順番に <filename>application/Bootstrap.php</filename> ファイルを実行します。
                    結果としてフロント・コントローラをディスパッチすることになります。
                    ウェブサーバのウェブ・ルートは、このディレクトリに一般的にセットされます。
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis><filename>scripts/</filename></emphasis>:
                    このディレクトリは、メンテナンスやビルド・スクリプトを含みます。
                    このようなスクリプトは、コマンド・ライン、クロン、
                    または実行時には実行されず、アプリケーションの
                    <!-- TODO -->correct
                    機能の一部である
                    <!-- TODO -->phing
                    ビルドされたスクリプトを含むかもしれません。
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis><filename>temp/</filename></emphasis>:
                    <filename>temp/</filename> フォルダは、一時的なアプリケーションデータのためにとっておかれます。
                    この情報は一般的に、アプリケーション svn リポジトリには入れられません。
                    <filename>temp/</filename> ディレクトリ配下のデータが削除されると、
                    データがもう一度リストアされるか、再キャッシュされるまで、
                    アプリケーションは、パフォーマンスが低下した状態で動作し続ける可能性があります。
                </para>
            </listitem>

            <listitem>
                <para>
                    <emphasis><filename>tests/</filename></emphasis>:
                    このディレクトリは、アプリケーションのテストを含みます。
                    これらは手書きや、PHPUnit テスト、Selenium-RC ベースのテスト、
                    またはその他の何かのテスト・フレームワークに基づきます。
                    既定では、ライブラリーのコードは <filename>library/</filename>
                    ディレクトリのディレクトリ構造をまねることによりテストできます。
                    さらに、アプリケーションのための機能テストは、
                    <filename>application/</filename> ディレクトリの構造
                    （アプリケーション・サブディレクトリを含む）をまねて書けました。
                </para>
            </listitem>
        </itemizedlist>
    </sect1>

    <sect1 id="project-structure.filesystem">
        <title>モジュール構造</title>

        <para>
            モジュールのためのディレクトリ構造は、推奨されたプロジェクト構造の中の
            <filename>application/</filename> ディレクトリのそれを模倣しなければなりません。
        </para>

        <programlisting language="text"><![CDATA[
<modulename>
    configs/
        application.ini
    controllers/
        helpers/
    forms/
    layouts/
        filters/
        helpers/
        scripts/
    models/
    services/
    views/
        filters/
        helpers/
        scripts/
    Bootstrap.php
]]></programlisting>

        <para>
            これらのディレクトリの目的は、推奨されたプロジェクト・ディレクトリ構造に関してと全く同じままです。
        </para>
    </sect1>

    <sect1 id="project-structure.rewrite">
        <title>リライト設定ガイド</title>

        <para>
            <acronym>URL</acronym> リライトは、 <acronym>HTTP</acronym> サーバの共通機能です。
            しかしながら、ルールと構成は、それらの間ではなはだしく異なります。
            下記は、書いた時点で利用できる、ポピュラーな様々なウェブサーバを通じた
            多少の共通するアプローチです。
        </para>

        <sect2 id="project-structure.rewrite.apache">
            <title>Apache HTTPサーバ</title>

            <para>
                移行の例では全て、 <property>mod_rewrite</property> （ Apache にバンドルされた公式モジュール）
                を使います。
                それを使うために、 <property>mod_rewrite</property> はコンパイル時に含まれるか、
                動的共用オブジェクト (<acronym>DSO</acronym>) として許可されなければなりません。
                詳しくは、あなたのバージョンの <ulink
                    url="http://httpd.apache.org/docs/">Apache ドキュメント</ulink>を参照してください。
            </para>

            <sect3 id="project-structure.rewrite.apache.vhost">
                <title>バーチャルホスト内でのリライト</title>

                <para>
                    これは非常に基本的なバーチャルホスト定義です。
                    これらのルールは、一致するファイルが <property>document_root</property> 配下で見つかった時を除き、
                    リクエスト全てを <filename>index.php</filename> に導きます。
                </para>

                <programlisting language="text"><![CDATA[
<VirtualHost my.domain.com:80>
    ServerName   my.domain.com
    DocumentRoot /path/to/server/root/my.domain.com/public

    RewriteEngine off

    <Location />
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} -s [OR]
        RewriteCond %{REQUEST_FILENAME} -l [OR]
        RewriteCond %{REQUEST_FILENAME} -d
        RewriteRule ^.*$ - [NC,L]
        RewriteRule ^.*$ /index.php [NC,L]
    </Location>
</VirtualHost>
]]></programlisting>

                <para>
                    <filename>index.php</filename> の前におかれたスラッシュ ("/") に注意してください。
                    <filename>.htaccess</filename> でのルールはこの点に関しては異なります。
                </para>
            </sect3>

            <sect3 id="project-structure.rewrite.apache.htaccess">
                <title>.htaccessファイル内でのリライト</title>

                <para>
                    下記は<property>mod_rewrite</property>を利用する
                    <filename>.htaccess</filename>ファイルの例です。
                    これは、リライト・ルールだけを定義し、
                    <filename>index.php</filename> から先行するスラッシュが省略されたことを除けば、
                    バーチャルホストの設定に似ています。
                </para>

                <programlisting language="text"><![CDATA[
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
]]></programlisting>

                <para>
                    <property>mod_rewrite</property>を設定する方法はたくさんあります。
                    もし、詳細をお好みでしたら、Jayson Minard の<ulink
                        url="http://devzone.zend.com/a/70">Blueprint for PHP Applications:
                    Bootstrapping</ulink>をご覧下さい。
                </para>
            </sect3>

        </sect2>

        <sect2 id="project-structure.rewrite.iis">
            <title>Microsoft Internet Information サーバ</title>

            <para>
                バージョン 7.0 現在、 <acronym>IIS</acronym> には現在標準的なリライト・エンジンが含まれます。
                適切なリライトルールを作成するために、以下の構成を使うかもしれません。
            </para>

            <programlisting language="xml"><![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="Imported Rule 1" stopProcessing="true">
                    <match url="^.*$" />
                    <conditions logicalGrouping="MatchAny">
                        <add input="{REQUEST_FILENAME}"
                             matchType="IsFile" pattern=""
                             ignoreCase="false" />
                        <add input="{REQUEST_FILENAME}"
                             matchType="IsDirectory"
                             pattern=""
                             ignoreCase="false" />
                    </conditions>
                    <action type="None" />
                </rule>
                <rule name="Imported Rule 2" stopProcessing="true">
                    <match url="^.*$" />
                    <action type="Rewrite" url="index.php" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>
]]></programlisting>
        </sect2>
    </sect1>
</appendix>
