My Perfect ZF2 Skeleton
Introduction
This is my own ZF2 skeleton application using the ZF2 MVC layer and module systems. Purpose of this is to provide a starting point of building simple, but also complex and enterprise applications. This skeleton comes with Phing build script, that can be used in Continous Integration tools like Jenkins or Travis., (*1)
QEngine modules
Below are modules, that support building applications and point you to the PHP "best practices".
* qengine/qengine-base - very early stage
* qengine/qengine-locale, (*2)
Installation using Composer
The easiest way to create a new ZF2 project is to use Composer. If you don't have it already installed, then please install as per the documentation., (*3)
Create your new ZF2 project:, (*4)
composer create-project -n -sdev qengine/qengine-skeleton path/to/install
Installation using a tarball with a local Composer
If you don't have composer installed globally then another way to create a new ZF2 project is to download the tarball and install it:, (*5)
-
Download the tarball, extract it and then install the dependencies with a locally installed Composer:, (*6)
cd my/project/dir
curl -#L https://github.com/zendframework/ZendSkeletonApplication/tarball/master | tar xz --strip-components=1
-
Download composer into your proejct directory and install the dependencies:, (*7)
curl -s https://getcomposer.org/installer | php
php composer.phar install
If you don't have access to curl, then install Composer into your project as per the documentation., (*8)
Build script
Tu run build script, first you have to install Phing. Then in your project root directory run:, (*9)
phing
What this script is doing:
* Install composer dependecies
* Check for PHP syntax errors in your source files
* Run unit tests
* Analise project for quality assurance (pdepend, phpmd, phpcpd, phpcs, phpdoc, phploc, phpcb), (*10)
Web server setup
Docker containers
This skeleton comes with basic script, that is used by docker-compose, to create a local and powerful development infrastructure. By default there is only one container enabled - Apache 2.4, PHP 5.6 (FastCGI), however this script comes with two others: MySQL and Jenkins containers., (*11)
I assume you are familiar with Docker and have already installed it (and boot2docker for OSX or Windows) together with Docker orchestration tool: docker-compose. Edit script file to meet your requirments (don't forget about data volumes). Add valid entry to your /etc/hosts
file (If you're on OSX or Windows, you can retrieve your VM IP by running: shell boot2dock ip
) Now you are ready to run:, (*12)
docker-compose up -d
If you're interested in my other Docker images visit https://hub.docker.com/u/jakubigla/., (*13)
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:, (*14)
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., (*15)
Note: The built-in CLI server is for development only., (*16)
Apache setup
To setup apache, setup a virtual host to point to the public/ directory of the
project and you should be ready to go! It should look something like below:, (*17)
<VirtualHost *:80>
ServerName zf2-app.localhost
DocumentRoot /path/to/zf2-app/public
<Directory /path/to/zf2-app/public>
DirectoryIndex index.php
AllowOverride All
Order allow,deny
Allow from all
<IfModule mod_authz_core.c>
Require all granted
</IfModule>
</Directory>
</VirtualHost>
Nginx setup
To setup nginx, open your /path/to/nginx/nginx.conf
and add an
include directive below
into http
block if it does not already exist:, (*18)
http {
# ...
include sites-enabled/*.conf;
}
Create a virtual host configuration file for your project under /path/to/nginx/sites-enabled/zf2-app.localhost.conf
it should look something like below:, (*19)
server {
listen 80;
server_name zf2-app.localhost;
root /path/to/zf2-app/public;
location / {
index index.php;
try_files $uri $uri/ @php;
}
location @php {
# Pass the PHP requests to FastCGI server (php-fpm) on 127.0.0.1:9000
fastcgi_pass 127.0.0.1:9000;
fastcgi_param SCRIPT_FILENAME /path/to/zf2-app/public/index.php;
include fastcgi_params;
}
}
Restart the nginx, now you should be ready to go!, (*20)