Symfonyで環境の違いを考慮した設定方法

symfonyのインストールディレクトリが違う

三項演算子なりswich文なりで、パスを動的に書き換える。
ヒットする可能性が高い順に調べることで、比較回数を減らすよう考慮すべし。

web/index.php
<?php
$path = is_file('/usr/local/share/pear/symfony/autoload/sfCoreAutoload.class.php')
  ? '/usr/local/share/pear/symfony/autoload/sfCoreAutoload.class.php'
  : '/usr/share/pear/symfony/autoload/sfCoreAutoload.class.php';

require_once $path;

sfCoreAutoload::register();

class ProjectConfiguration extends sfProjectConfiguration
{
  public function setup()
  {
    // for compatibility / remove and enable only the plugins you want
    $this->enableAllPluginsExcept(array('sfPropelPlugin', 'sfCompat10Plugin'));
  }
}

cookieのパス

factories.ymlで設定可能ですが、factries.yml読み込み時にはRequestオブジェクトがまだ作成されていないので正規表現で動的に作成しました。正規表現は sfWebRequest.class.php の getRelativeUrlRoot メソッドから拝借。

apps/frontend/config/factories.yml
all:
  storage:
    class: sfSessionStorage
    param:
      session_name: symfony
      session_cookie_path: <?php echo preg_replace('#/[^/]+\.php5?$#', '', $_SERVER['SCRIPT_NAME']).'/' ?>

その他

databases.yml や .htaccess は変更なしで使えるようテスト環境、本番環境で揃えた方が楽。無理な場合は、バージョン管理やrsync対象から外す。その代わり、databases.yml.sample .htaccess.sample というファイルを用意しておき、リネーム(.sample削る)して環境に応じて編集するようにすれば1から記述する手間が多少減る。

.gitignore

Git用にこんな設定にしてます。

*.swp
cache/
data/
log/
config/databases.yml
web/.htaccess

init.sh

.gitignoreの対になるシェルスクリプトとしてこんなの作りました。

#!/bin/sh
mkdir -p cache data/fixtures data/sql log
chmod 777 cache log
cp config/databases.yml.sample config/databases.yml
cp web/.htaccess.sample web/.htaccess

git clone してきた後に

$ ./init.sh

することで、必要なディレクトリを生成します。