| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- Reviewed: no -->
- <appendix id="project-structure">
- <title>Recommended Project Structure for Zend Framework MVC Applications</title>
- <sect1 id="project-structure.overview">
- <title>Overview</title>
- <para>
- Many developers seek guidance on the best project structure for a Zend Framework project
- in a relatively flexible environment. A "flexible" environment is one in which the
- developer can manipulate their file systems and web server configurations as needed to
- achieve the most ideal project structure to run and secure their application. The
- default project structure will assume that the developer has such flexibility at their
- disposal.
- </para>
- <para>
- The following directory structure is designed to be maximally extensible for complex
- projects, while providing a simple subset of folder and files for project with simpler
- requirements. This structure also works without alteration for both modular and
- non-modular ZF applications. The <filename>.htaccess</filename> files require URL
- rewrite functionality in the web server as described in the <link
- linkend="project-structure.rewrite-guide">Rewrite Configuration Guide</link>, also
- included in this appendix.
- </para>
- <para>
- It is not the intention that this project structure will support all possible ZF project
- requirements. The default project profile used by <classname>Zend_Tool</classname>
- reflect this project structure, but applications with requirements not supported by this
- structure should use a custom project profile.
- </para>
- </sect1>
- <sect1 id="project-structure.project">
- <title>Recommended Project Directory Structure</title>
- <literallayout>
- <project name>/
- application/
- configs/
- application.ini
- controllers/
- helpers/
- 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/
- </literallayout>
- <para>
- The following describes the use cases for each directory as listed.
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>application/</emphasis>: This directory contains your application. It
- will house the MVC system, as well as configurations, services used, and your
- bootstrap file.
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>configs/</emphasis>: The application-wide configuration
- directory.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>controllers/</emphasis>, <emphasis>models/</emphasis>, and
- <emphasis>views/</emphasis>: These directories serve as the default
- controller/model/view directories. Having these three directories inside
- the application directory provides the best layout for starting a simple
- project as well as starting a modular project that has global
- controllers/models/views.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>controllers/helpers/</emphasis>: These directories will
- contain action helpers. Action helpers will be namespaced either as
- "Controller_Helper_" for the default module or
- "<Module>_Controller_Helper" in other modules.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>layouts/</emphasis>: This layout directory is for MCV-based
- layouts. Since <classname>Zend_Layout</classname> is capable of MVC-
- and non-MVC-based layouts, the location of this directory reflects that
- layouts are not on a 1-to-1 relationship with controllers and are
- independent of templates within <filename>views/</filename>.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>modules/</emphasis>: Modules allow a developer to group a set
- of related controllers into a logically organized group. The structure
- under the modules directory would resemble the structure under the
- application directory.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>services</emphasis>: This directory is for your application
- specific web-service files that are provided by your application, or for
- implementing a <ulink
- url="http://www.martinfowler.com/eaaCatalog/serviceLayer.html">Service
- Layer</ulink> for your models.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>Bootstrap.php</emphasis>: This file is the entry point for
- your application, and should implement
- <interfacename>Zend_Application_Bootstrap_Bootstrapper</interfacename>.
- The purpose for this file is to bootstrap the application and make
- components available to the application by initializing them.
- </para>
- </listitem>
- </itemizedlist>
- </listitem>
- <listitem>
- <para>
- <emphasis>data</emphasis>: This directory provides a place to store application
- data that is volatile and possibly temporary. The disturbance of data in this
- directory might cause the application to fail. Also, the information in this
- directory may or may not be committed to a subversion repository. Examples of
- things in this directory are session files, cache files, sqlite databases, logs
- and indexes.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>docs/</emphasis>: This directory contains documentation, either
- generated or directly authored.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>library/</emphasis>: This directory is for common libraries on which
- the application depends, and should be on the PHP
- <varname>include_path</varname>. Developers should place their application's
- library code under this directory in a unique namespace, following the
- guidelines established in the PHP manual's <ulink
- url="http://www.php.net/manual/en/userlandnaming.php">Userland Naming
- Guide</ulink>, as well as those established by Zend itself. This may directory
- may also include Zend Framework itself; if so, you would house it in
- <filename>library/Zend/</filename>.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>public/</emphasis>: This directory contains all public files for your
- application. <filename>index.php</filename> sets up and invokes
- <classname>Zend_Application</classname>, which in turn invokes the
- <filename>application/Bootstrap.php</filename> file, resulting in dispatching
- the front controller. The web root of your web server would typically be set to
- this directory.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>scripts/</emphasis>: This directory contains maintenance and/or build
- scripts. Such scripts might include command line, cron, or phing build scripts
- that are not executed at runtime but are part of the correct functioning of the
- application.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>temp/</emphasis>: The <filename>temp/</filename> folder is set aside
- for transient application data. This information would not typically be
- committed to the applications svn repository. If data under the
- <filename>temp/</filename> directory were deleted, the application should be
- able to continue running with a possible decrease in performance until data is
- once again restored/recached.
- </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>tests/</emphasis>: This directory contains application tests. These
- could be hand-written, PHPUnit tests, Selenium-RC based tests or based on some
- other testing framework. By default, library code can be tested by mimicing the
- directory structure of your <filename>library/</filename> directory.
- Additionally, functional tests for your application could be written mimicing
- the <filename>application/</filename> directory structure (including the
- application subdirectory).
- </para>
- </listitem>
- </itemizedlist>
- </sect1>
- <sect1 id="project-structure.filesystem">
- <title>Module Structure</title>
- <para>
- The directory structure for modules should mimic that of the
- <filename>application/</filename> directory in the recommended project structure:
- </para>
- <literallayout>
- <modulename>/
- configs/
- application.ini
- controllers/
- helpers/
- layouts/
- filters/
- helpers/
- scripts/
- models/
- services/
- views/
- filters/
- helpers/
- scripts/
- Bootstrap.php
- </literallayout>
- <para>
- The purpose of these directories remains exactly the same as for the recommended
- project directory structure.
- </para>
- </sect1>
- <sect1 id="project-structure.rewrite">
- <title>Rewrite Configuration Guide</title>
- <para>
- URL rewriting is a common function of HTTP servers. However, the rules and configuration
- differ widely between them. Below are some common approaches across a variety of popular
- web servers available at the time of writing.
- </para>
- <sect2 id="project-structure.rewrite.apache">
- <title>Apache HTTP Server</title>
- <para>
- All examples that follow use <application>mod_rewrite</application>, an official
- module that comes bundled with Apache. To use it,
- <application>mod_rewrite</application> must either be included at compile time or
- enabled as a Dynamic Shared Object (DSO). Please consult the <ulink
- url="http://httpd.apache.org/docs/">Apache documentation</ulink> for your
- version for more information.
- </para>
- <sect3 id="project-structure.rewrite.apache.vhost">
- <title>Rewriting inside a VirtualHost</title>
- <para>
- Here is a very basic virtual host definition. These rules direct all requests
- to <filename>index.php</filename>, except when a matching file is found under
- the <option>document_root</option>.
- </para>
- <programlisting language="xml"><![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>
- Note the slash ("/") prefixing <filename>index.php</filename>; the rules for
- <filename>.htaccess</filename> differ in this regard.
- </para>
- </sect3>
- <sect3 id="project-structure.rewrite.apache.htaccess">
- <title>Rewriting within a .htaccess file</title>
- <para>
- Below is a sample <filename>.htaccess</filename> file that utilizes
- <application>mod_rewrite</application>. It is similar to the virtual host
- configuration, except that it specifies only the rewrite rules, and the leading
- slash is omitted from <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>
- </sect3>
- <para>
- There are many ways to configure <application>mod_rewrite</application>; if you
- would like more information, see Jayson Minard's <ulink
- url="http://devzone.zend.com/a/70">Blueprint for PHP Applications:
- Bootstrapping</ulink>.
- </para>
- </sect2>
- <sect2 id="project-structure.rewrite.iis">
- <title>Microsoft Internet Information Server</title>
- <para>
- As of version 7.0, IIS now ships with a standard rewrite engine. You may use the
- following configuration to create the appropriate rewrite rules.
- </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>
|