[Zend Framework] Vagrant 環境に Zend Framework 1 と Zend Framework 2 をインストールする

以前に作った Zend アプリケーションを Vagrant 環境で動かせるようにしておくと良いかなと思いたち、ひとまずスケルトンプロジェクト作成をしました。

System requirements

必要要件を確認します。
Zend Framework 1.12dev … PHP 5.2.11 or later.

Zend Framework 2.3.4dev … PHP 5.3.23 or later.

(CentOS 6.5 標準でインストールされるのは PHP 5.3.3 で、ZF2 のスケルトンアプリが表示されずにはまりました。)

ファイルレイアウト

  • /vagrant/www ディレクトリを作成し、そのなかにプロジェクトを作成します。
  • composer でインストールします。
  • PHP, ZF1, ZF2 のプロジェクトを動かせるようにします。
  • それぞれのプロジェクトの /public を Virtual host のドキュメントルートに設定します。
ファイルレイアウトのイメージ
.
├── Gemfile
├── Gemfile.lock
├── Vagrantfile
├── cookbooks
├── data_bags
├── environments
├── nodes
├── roles
├── site-cookbooks
│   └── zend
└── www
    ├── composer.json
    ├── composer.lock
    ├── php
    ├── vendor
    ├── zf1
    └── zf2

このディレクトリを synced_folder で /vagrant として読み込みます。

バーチャルホストの設定をする

httpd.conf にバーチャルホストの設定を加えておきます。

/site-cookbooks/zend/templates/default/httpd.conf.erb
    :
<virtualHost *:<%= node['httpd']['port'] %>>
    DocumentRoot <%= node['httpd']['php'] %>
    ServerName php.local
</virtualHost>
<virtualHost *:<%= node['httpd']['port'] %>>
    DocumentRoot <%= node['httpd']['zf1'] %>
    ServerName zf1.local
    SetEnv APPLICATION_ENV "development"
    <directory <%= node['httpd']['zf1'] %>>
        DirectoryIndex index.php
        AllowOverride All
        Order allow,deny
        Allow from all
    </directory>
</virtualHost>
<virtualHost *:<%= node['httpd']['port'] %>>
    DocumentRoot <%= node['httpd']['zf2'] %>
    ServerName zf2.local
    SetEnv APPLICATION_ENV "development"
    <directory <%= node['httpd']['zf2'] %>>
        DirectoryIndex index.php
        AllowOverride All
        Order allow,deny
        Allow from all
    </directory>
</virtualHost>
    :

composer でインストールする

composer install を実行し、ライブラリをインストールします。

composer.json
{
  "repositories": [
    {
      "type": "composer",
      "url": "https://packages.zendframework.com/"
    }
  ],
  "require": {
    "zendframework/zendframework": "2.3.*@dev",
    "zendframework/zftool": "dev-master",
    "zendframework/zendframework1": "1.12.*@dev"
  }
}

ZF2 では zf コマンドがなくなったので、Zend Framework 2 Tool をあわせてインストールします。

PHP のプロジェクトを作成する

ドキュメントルートに phpinfo を表示するファイルを置いておきます。

index.php
<?php
  phpinfo();

Zend Framework 1 のプロジェクトを作成する

zf コマンドを探して、プロジェクトを作成します。

% vendor/zendframework/zendframework1/bin/zf.sh create project zf1

composer のオートローダーを呼ぶように /public/index.php に以下を追記します。

require_once realpath('/vagrant/www/vendor/autoload.php');

Zend Framework 2 のプロジェクトを作成する

Zend Framework 2 Tool でプロジェクトを作成します。

プロジェクトディレクトリ内で composer を実行するよう指示されますが、すでに ZF2 はインストール済なので飛ばします。

% vendor/bin/zf.php create project zf2
ZF2 skeleton application installed in zf2.
In order to execute the skeleton application you need to install the ZF2 library.
Execute: "composer.phar install" in zf2
For more info in zf2/README.md

index.php を読むと、init_autoloader.php が呼ばれており、ZF2 のライブラリの場所を伝えてあげる必要があることが分かりました。
ZF2_PATH に composer でインストールしたパスを渡してあげるよう、下記を追記します。

public/index.php
    :
chdir(dirname(__DIR__));
$path = realpath(dirname(__DIR__) . '/../vendor/zendframework/zendframework/library/');
putenv("ZF2_PATH=" . $path);
    :

vagrant up

あとは vagrant up です。

http://php.local/

2014-09-25_zend_01

http://zf1.local/

2014-09-25_zend_02

http://zf2.local/

2014-09-25_zend_03

一式をまとめました。

補遺

remi, epel repo の追加

前述の通り PHP のバージョンを上げる必要があり、yum repo 追加をシェルスクリプトで間に合わせました。

/site-cookbooks/zend/templates/recipes/default.erb
    :
bash "add_yum_repo" do
  user "root"
  cwd "/vagrant/www"
  code <<-EOH
  sudo rpm -Uvh http://ftp.jaist.ac.jp/pub/Linux/Fedora/epel/6/i386/epel-release-6-8.noarch.rpm
  sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
  sudo yum install -y --enablerepo=remi-php55 php php-mbstring httpd mysql-server
  EOH
end
    :

こちらを参考にさせて頂きました。