絶品ゆどうふのタレ

ふと気づいたことを綴るだけのメモ

symfonyコマンドをどこでも使えるようにする

今日のPHPer飲み会でまたしてもid:cocoitiさんに「ちゃんとブログに書いて情報共有しなさい><」って怒られてしまったので、今日の飲み会で言ってたsymfonyコマンドがプロジェクトトップディレクトリでしか使えない件を簡単に解決する方法についてメモ。


言い訳しとくと、このあたりは普通に情報が共有されてることだと思ってたんです><
でも、自分にとっては常識でも、実は他の人は全然知らないちょーーとしたことってけっこうあるよね!><


で、だ。


symfonyコマンドは、実は2つある。
1つは、普段使っている/usr/local/binなどのパスの通った場所にあるsymfonyコマンド
もう1つはプロジェクト生成時に、プロジェクトディレクトリ直下に同時に生成されるsymfonyコマンド。
ちなみにどちらもPHP-CLI

symfonyコマンドは通常、プロジェクトディレクトリ直下で使わなければいけない(エラーになる)のだけれどこれはあくまで1つ目のsymfonyコマンドを使おうとした場合の事。
実はプロジェクトディレクトリ直下にある方のsymfonyコマンドを絶対パスでたたくと、どのディレクトリにいても対象のプロジェクトに対してsymfonyコマンドを発行できる。
一番深ーいactions/ディレクトリの中でも、自分のホームでもsymfony ccできる。


なので、たとえば.bashrcとかに

alias hogesymfony='/path/to/proj/symfony'

とか定義しておけば、

$ hogesymfony cc

ってやってsymfony ccできたりする。
まぁこれは簡易方法だけど応用はご自由にという感じ。


これのカラクリは両方のsymfonyコマンドを見てもらえれば秒殺でわかるのだけれど、前者のsymfonyコマンドは、自分のいる場所から一個掘ったconfig/config.phpの設定情報を読みに行くことで、プロジェクトの基本情報を取得してる。

<?php

// project exists?
if (file_exists('config/config.php'))
{
  include('config/config.php');
}
// 以下略

そんなわけで、プロジェクトディレクトリ直下じゃないと正しくconfig.phpが読めなくてこける。


対して、後者のsymfonyコマンドも同じようにconfig.phpを読みに行くんだけど、コイツは必ずプロジェクト直下にいるので、読みに行くconfig.phpの位置が決まっている。まぁ、わざわざ絶対パスで呼んでるんだし当たり前といえば当たり前。

<?php

chdir(dirname(__FILE__));
include('config/config.php');
include($sf_symfony_data_dir.'/bin/symfony.php');

でも、このおかげで特定のプロジェクトに対するsymfonyコマンドに対して個別にaliasを割り振ることで、複数のプロジェクトがあっても間違うことなく、どんな場所でもsymfonyコマンドを実行できる、と。


こんな感じの小ネタでした><