人生初の24時間以上のハッカソンイベントの phpmatsuri に参加してきた。
感想から反省点までいろいろあるのでまとめするよ。

3回くらいに分けて。

の前に、運営したスタッフや素晴らしいGuestの方々にお礼を申し上げたい。

Thank you for exciting hack-event today!!

Symfony Cake

CakePHP Cake と Lithium Cake と一緒にきました!
すごくボリューム感あふれるケーキでした。
ちなみに途中で僕が切って分けていたりしました。不器用でごめんなさい。

Posted in PHP.

というわけで、未完成な雰囲気が溢れる symfony-bootstrapper を使って
プロジェクトを始めるまでをまとめます。

一先ず無知なくせに人柱になってみました。こんにちはこんにちは。

良い子の Symfonist のみなさんはドキュメントにあるとおり、 symfony-sandbox を使ったほうが良いです。
さらに、状況は刻々と変化しております。 最新の情報は
こことは別でちゃんと仕入れてください。

まず、 symfony-bootstrapper の symfony.phar でプロジェクトを作成します。
この点は、 balibali 先生の言うとおりです。

“これだけだとシンプルすぎて動かないので vendor 作ったり .htaccess 置いたりは必要です”

人のことなので、 vendor/ やら .htaccess やらを用意します。

http://github.com/symfony/symfony-bootstrapper/blob/master/bin/install_vendors.sh

を使うと、 vendor がバッチリ導入できる予感がしますが、そんなワケにもいかないです。
どうも Symfony2 は名前空間を変更したりで、Doctrineなどでやや古いタグにされてしまうと
上手く動かないのです。

やや強引ですが、 git checkout -b v2.0.0-BETA3 2.0.0-BETA3 のように
タグを切り替ている行をコメントアウトしてしまいます。
その後、プロジェクトのディレクトリに移動して、 install_vendors.sh を実行します。

これで、 vendor/ が用意されましたが、まだ動きません。
web/ に .htaccess を用意します。これは symfony1.4 のプロジェクトからコピーでなんとかなります。

問題はここからで、ここで動くと思っていたらやっぱり動きません。

なんでだろう???と探ったところ

app/AppKernel.php の一部を変更する必要があるようです。

    public function registerBundleDirs() {
        return array(
            'Application'     => __DIR__.'/../src/Application',
            'Bundle'          => __DIR__.'/../src/Bundle',
            'Symfony\\Bundle' => __DIR__.'/../src/vendor/Symfony/src/Symfony/Bundle',
        ); }

ちょうど、こんな行がありますが、 Symfony\\Bundle のパスは

__DIR__.’/../src/vendor/symfony/src/Symfony/Bundle’

に変えてやります。なぜか大文字と小文字が違うようです。

あとは、 asset(デバックページの画像とか) をちゃんと表示したいので

$ ./app/console web

これで、 web/app_dev.php とかにアクセスすると、なんとか動いている雰囲気を
味わって謎の充実感を得ることが出来ます。

なんか面倒なので、公式の言うとおり symfony-sandbox で遊んだほうが良いです。
【追記】 phpmatsuriでkrisに聞いたら、やっぱり現状 sandboxで遊ぶべきということが判明しました。

あとウソチクもあるかもしれないので、ちゃんと公式から出るまで待つべきです。

僕の開発サーバには、いろいろ実験した成果というか
残骸的な意味で、PHP5.3 + suhosin patch に加えて suhosin extension
も入っています。

suhosinさんは、PHPのセキュリティ的な問題を解決したり、プログラマーのミスに気づかせてくれるイカしたやつです。”suhosin”は韓国語で、日本語で表すと「守護神」っていうのもなかなかクール。

しかし、ごくごくたまに(開発環境にとって的な意味で)過剰にいろいろやってくれたりもします。

今回は、 symfony-bootstrapper さんを使ってプロジェクト開始しようと思った矢先に発生しました。
こいつの使い方は balibali 先生が解説しておりますので、そちらをご覧いただければと思います。

その中で、 phar を動かす場面があります。
PHP5.3から組み込みとなったモジュールで、 Java でいう jar 的な役割です。

$ php symfony.phar

と、早速実行とやってみたところ、エラーすら出ません。
しょうが無いので syslog を見てみたら

Sep 30 02:14:17 happyturn suhosin[11234]: ALERT - Include filename ('phar:///home/kawahara/dev/symfony.phar/_cli_stub.php') is an URL that is not allowed (attacker 'REMOTE_ADDR not set', file '/home/kawahara/dev/symfony.phar', line 9)

なんかすごく、怒られています。

勘で suhosin extension を off にしてみたところ、このエラーは出ずに正常に動いたようでした。
流石は守護神ですね。

さらに、調べてみたところ

Suhosin PHAR “URL not allowed”

なる記事を発見。

どうやら、 phar は phar というスキームを使って、include するコードがあるらしく
suhosinさんは、include で URI を読み込もうとすると、チェックが働くようです。
“disallows Remote URL inclusion (optional: black-/whitelisting)” とありますね。

というわけで上の記事では phar をホワイトリストに追加しています。

ちなみに、 symfony-bootstrapper にある install_vendors.sh を使うと
console でコケます。理由は、symfony側で名前空間が変っているのに
doctrineのbeta3だと対応できていないというところにあります。