Symfony2: よりかんたんになりました (パート 2)

by Fabien Potencier – May 05, 2011

昨日、コアチームのメンバーの1人が筆者に助けを求めました。彼はバンドルエクステンションの命名規約を覚えていませんでした。命名規約はバンドルの名前にサフィックスとして Bundle の代わりに Extension をつけた基本的なものです。しかし彼の場合、それがうまく機能しませんでした。率直に言えば、私たちは行き詰まりました。筆者の場合は機能するのに彼の場合うまくゆかないことがさっぱりわかりませんでした。しかし数分後、彼は問題を発見しました。名前空間の宣言に誤字がありました。

// ファイルは Foo/Bar/Baz.php です。
namespace Foo/Bab;

// 名前空間は Foo/Bab ですが、
// パスは Foo/Bar であることにご注意ください!

class Baz
{
    // ...
}

私は彼のコードにアクセスできなかったので、問題を見つけることができませんでした。助けようとしている人のために作業ができないので、これは本当にイライラすることです。ある時点で、フレームワークに怒鳴り始め、こいつは「複雑すぎる」と言って最終的にあきらめることになります。筆者は過去において何度もまったく同じ問題に遭遇しました。みなさんも経験なさっていることでしょう。そしてあきらめないのであれば、問題を発見する前に数時間費やし、自分を責め始めます! 問題がフレームワークに関係ない場合でも、デベロッパーエクスペリエンスを高めることは可能でしょうか?第一に Symfony2 は開発者がこのエラーを避ける手助けになるでしょうか?誰かがこのような問題を報告するたびに、開発チームはフレームワークをよりよいものに変更する方法を考えます。 昨晩この具体的な問題を少し考えた後で、この状況をかんたんに改善して、世界中のみんなが何時間もイライラしなくてすむことが判明しました。Symfony2 の標準オートローダがファイルを見つけるたびに、オートローダはオートロードへのクラスが定義されているファイルを見つけるので、インクルードしたばかりのファイルのなかでクラスが効率的に宣言されていることをかんたんにチェックできます。それがあてはまらない場合、何かがまちがっています。

if (!class_exists($class, false) && !interface_exists($class, false)) {
    throw new \Exception(sprintf(
        'The autoloader expected class "%s" to be defined in file "%s".
         You probably have a typo in the namespace or the class name.',
    $class, $file));
}

本番サーバーでアプリケーションが遅くならないようするために、実際のパッチ はもう少し複雑ですが、アイディアは得られます。この強化内容は Symfony SE beta2 で利用できるようになります。

インデックス

Document Index

関連ページリスト

Related Pages

日本語ドキュメント

Japanese Documents

リリース情報
Release Information

Symfony2 に関する情報(公式) Books on symfony