Vagrant で Symfony2 の環境を構築する

Symfony2 を扱う必要が出てきたので構築のメモ

Vagrant の設定

下記の Vagrantfile を利用した
GitHub - simshaun/symfony-vagrant: Deprecated. Check out Puphpet.
こいつを、適当なフォルダ作ってぶちこむ。

$ cd /path/to/work/folder
$ git clone --recursive git://github.com/simshaun/symfony-vagrant.git my_symfony_folder
$ cd my_symfony_folder

Vagrantfile を覗くと、デフォルトだと上記で作ったフォルダが symfony のプロジェクトルートになっているっぽい。それだとREADMEとかが上書きされちゃうし、プロジェクトファイルが散らかっちゃって管理しにくいので、別のフォルダをつくってそこに入れた。Vagrantfile の web_apps をいじればいいっぽい。バーチャルホストも切れるっぽい。
# vagrant/Vagrantfile

web_apps = {
-  "project1" => {
-    "host_project_folder"  => "../",
-    "guest_project_folder" => "/home/vagrant/web-app",
-    "guest_docroot"        => "/home/vagrant/web-app/web",
-    "server_name"          => "localhost",
-    "server_aliases"       => ["*.localhost"],
-    "php_timezone"         => "America/New_York"
-  }
+  "site1" => {
+    "host_project_folder"  => "../app1/",
+    "guest_project_folder" => "/home/vagrant/site1",
+    "guest_docroot"        => "/home/vagrant/site1/web",
+    "server_name"          => "site1",
+    "server_aliases"       => ["*.site1"],
+    "php_timezone"         => "Asia/Tokyo"
+  },
+  "site2" => {
+    "host_project_folder"  => "../app2/",
+    "guest_project_folder" => "/home/vagrant/site2",
+    "guest_docroot"        => "/home/vagrant/site2/web",
+    "server_name"          => "site2",
+    "server_aliases"       => ["*.site2"],
+    "php_timezone"         => "Asia/Tokyo"
+  }
}

上記のように変更したら、共有先のフォルダを作る。Composer で Symfony2 を落としてくる。

Composer のインストール

色々インストール方法はあるけど、今回はComposerを使うようにした。

$ curl -sS https://getcomposer.org/installer | php -d detect_unicode=Off # エラー回避するために detect_unicode=Off に
$ sudo chmod 755 composer.phar
$ sudo mv composer.phar /usr/local/bin/composer

Symfony2 インストール

上記で app1、app2 とフォルダを設定したので、それぞれについて composer を実行する

$ composer create-project symfony/framework-standard-edition app1 2.4.2
$ composer create-project symfony/framework-standard-edition app2 2.4.2

最後の2.4.2はSymfonyのバージョン。今は2.4.2が最新らしい。インストール中に色々聞かれるけど、基本的に全部デフォルトでいいかも。DB の設定とかはあとで直せるし。

仕上げ

もしバーチャルホストを切っていたら、ホスト側にその名前を追加しておく。上記の設定なら

33.33.33.10 site1
33.33.33.10 site2

そしてプロビジョニング。

$ cd vagrant
$ vagrant up

どうやら上記のVagrantfileは共有フォルダだけしか反映されないようなので、apache の conf ファイルを書き足す。下記は一例
# vagrant ssh
# sudo rm /etc/apache2/site-enabled/localhost.conf
# sudo vi /etc/apache2/site-enabled/app1.conf

<VirtualHost *:80>
  ServerName site1
  ServerAlias *.site1
  DocumentRoot /home/vagrant/site1/web

  LogLevel debug
  ErrorLog /home/vagrant/site1/app/logs/error.log
  CustomLog /home/vagrant/site1/app/logs/access.log combined

  RewriteEngine On
  RewriteLog /home/vagrant/site1/app/logs/rewrite.log
  RewriteLogLevel 0

  php_value date.timezone Asia/Tokyo

  <Directory /home/vagrant/site1/web>
    php_admin_value upload_tmp_dir /tmp/site1
  </Directory>
</VirtualHost>

設定ファイルの配置ができたら apache 再起動

$ sudo service apache2 restart

で、http://site1/ にアクセスするとサイトが見れるはず。ssh しなくてもホスト側の app1 や app2 以下のファイルをいじれば反映される。
この際、Symfony の新規インストールの場合は config.php にアクセスすることで設定をするが、ホストからアクセスする場合はIP制限がかかっていて設定できないため、下記のファイルにホスト側のIPを追記しておく
# app1/web/config.php

if (!in_array(@$_SERVER['REMOTE_ADDR'], array(
     '33.33.33.1',  //この辺を追加
     '127.0.0.1',
     '::1',
 ))) {

# app1/web/app_dev.php

if (isset($_SERVER['HTTP_CLIENT_IP'])
     || isset($_SERVER['HTTP_X_FORWARDED_FOR'])
     || !in_array(@$_SERVER['REMOTE_ADDR'], array('33.33.33.1', '127.0.0.1', 'fe80::1', '::1')) // IP を追加
 ) {

そして、http://site1/config.php とかにホスト側のブラウザでアクセスし、設定していく。基本的には composer から入れていればこのへんの設定はできているはず。
あとはこの状態で git リポジトリに登録しておく

$ cd app1
$ git init
$ git add .
$ git rm --cached -r src/Acme* # Demoアプリは含めない
$ git commit -m 'initial commit'

Sass とか Compass とか使えるようにする

このへん を参考にした

$ vagrant ssh
$ sudo gem install sass --no-ri --no-rdoc
$ sudo gem install compass --no-ri --no-rdoc
$ exit

そして、config.yml の assetic の項目に次のように設定を追加
# vi app1/config/config.yml

assetic:
    debug:          %kernel.debug%
    use_controller: false
    filters:
        sass:    ~
        compass: ~

そして、Twig テンプレートを使う際に、下記のように指定してあげる。

{% stylesheets filter="compass"
    "@DemoBundle/Resources/public/sass/main.sass"
    "@DemoBundle/Resources/public/sass/header.sass"
    "@DemoBundle/Resources/public/sass/footer.sass"
%}
    <link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}