Installation

Using Composer

The recommended way to start a new Zend Framework project is to clone the skeleton application and use composer to install dependencies using the create-project command:

1
2
curl -s https://getcomposer.org/installer | php --
php composer.phar create-project -sdev --repository-url="https://packages.zendframework.com" zendframework/skeleton-application path/to/install

Alternately, clone the repository and manually invoke composer using the shipped composer.phar:

1
2
3
4
5
cd my/project/dir
git clone git://github.com/zendframework/ZendSkeletonApplication.git
cd ZendSkeletonApplication
php composer.phar self-update
php composer.phar install

(The self-update directive is to ensure you have an up-to-date composer.phar available.)

Another alternative for downloading the project is to grab it via curl, and then pass it to tar:

1
2
cd my/project/dir
curl -#L https://github.com/zendframework/ZendSkeletonApplication/tarball/master | tar xz --strip-components=1

You would then invoke composer to install dependencies per the previous example.

Using Git submodules

Alternatively, you can install using native git submodules:

1
git clone git://github.com/zendframework/ZendSkeletonApplication.git --recursive

Web Server Setup

PHP CLI Server

The simplest way to get started if you are using PHP 5.4 or above is to start the internal PHP cli-server in the root directory:

1
php -S 0.0.0.0:8080 -t public/ public/index.php

This will start the cli-server on port 8080, and bind it to all network interfaces.

Note

The built-in CLI server is for development only.

Apache Setup

To use Apache, setup a virtual host to point to the public/ directory of the project. It should look something like below:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<VirtualHost *:80>
   ServerName zf2-tutorial.localhost
   DocumentRoot /path/to/zf2-tutorial/public

   <Directory /path/to/zf2-tutorial/public>
       AllowOverride All
       Order allow,deny
       Allow from all
   </Directory>
</VirtualHost>

or, if you are using Apache 2.4 or above:

1
2
3
4
5
6
7
8
9
<VirtualHost *:80>
   ServerName zf2-tutorial.localhost
   DocumentRoot /path/to/zf2-tutorial/public

   <Directory /path/to/zf2-tutorial/public>
       AllowOverride All
       Require all granted
   </Directory>
</VirtualHost>

Rewrite Configuration

URL rewriting is a common function of HTTP servers, and allows all HTTP requests to be routed through the index.php entry point of a Zend Framework Application.

Apache comes bundled with the module``mod_rewrite`` for URL rewriting. To use it, mod_rewrite must either be included at compile time or enabled as a Dynamic Shared Object (DSO). Please consult the Apache documentation for your version for more information.

The Zend Framework Skeleton Application comes with a .htaccess that includes rewrite rules to cover most use cases:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
RewriteEngine On
# The following rule tells Apache that if the requested filename
# exists, simply serve it.
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
# The following rewrites all other queries to index.php. The
# condition ensures that if you are using Apache aliases to do
# mass virtual hosting, the base path will be prepended to
# allow proper resolution of the index.php file; it will work
# in non-aliased environments as well, providing a safe, one-size
# fits all solution.
RewriteCond %{REQUEST_URI}::$1 ^(/.+)(.+)::\2$
RewriteRule ^(.*) - [E=BASE:%1]
RewriteRule ^(.*)$ %{ENV:BASE}index.php [NC,L]

Microsoft Internet Information Services

As of version 7.0, IIS ships with a standard rewrite engine. You may use the following configuration to create the appropriate rewrite rules.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?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>