Symfony2 note at Apr 20, 2011

前回のDIコンテナの記事から4ヶ月ほど経ち、だいたい今まで書いた記事も役に立たなくなった感じですね。とりあえず最近Symfony2でコード書いてて思ったことをメモしておきます。

Form

1系の鬼門だったFormですが、ずいぶんよくなりました。今度Symfony2勉強会で発表予定。

Security

おそらく2系の鬼門。とりあえずFirewallの流れ。

  • URLをベースにFirewallの特定(Firewall, FirewallMap)
    • ContextListener: SessionとTokenの管理
      • トークンはセッションに格納されるが、デフォルトではEntityもシリアライズの対象
      • セッションにデータが入っていた場合でも、再度DBへアクセスしてデータをロード
    • LogoutListener: ログアウト
    • UsernamePasswordFormAuthenticationListener:
      • Requestから直接パラメーターを取得して認証されていない状態のトークンを発行
      • login_check用のURLにとんだ場合のみチェック
  • AuthenticationManager (AuthenticationProviderManager) がトークンを認証
    • security.ymlのprovidersはUserProviderの設定(EntityUserProviderなど)
      • UserProviderをデコレートしてDaoAuthenticationProviderが作られる
    • トークンに格納されているusernameとpasswordを使ってエンティティを取得
    • エンティティが取得できたら、それを元に認証済みのトークンを発行
  • トークンが取得できたらAbstractAuthenticationListenerがSecurityContextにトークンを格納
  • anonymousがtrueならanonymousでもOK
  • ROLEが1つでも設定されていないとAuthenticatedと見なされない(UsernamePassword)
  • EntityUserProviderに指定するEntityManagerはconfig.ymlからは変更不可
    • 詳しくは調べていないが、Extensionにて拡張する
    • デフォルトだとEntityManagerを再定義しているので、別インスタンスになるのでは疑惑
      • FOSUserBundleのInteractiveLoginListenerあたりでおかしくならない?

これでSecurityコンポーネントのAuthenticationの部分だけ。まだAuthorization部分が・・・。

あとSecurityBundleがしんどい。特にDICのSecurityFactory。

Doctrine

  • INの対応が残念
    • 2.1でsmartなのができるらしい
  • order by rand()はできない
    • order byに関数が書けない
    • selectに関数を書いて、order byで指定ならできる
      • rand関数は自前で定義
  • Select句にEntityのプロパティ以外を入れると、array(0 => $entity, 1 => $AVG) みたいな配列が返ってくる
  • DBから一度取得をしてないと、Entityをpersistしてもinsertにしかならない
    • UnitOfWorkをいじればできるみたい
  • generate:entitiesにバグ
    • 既にクラスファイルがある場合、namespace定義の下にuseが書かれていると既存のクラス内の定義が認識されなくなる
    • 自前でクラスファイルをパースしているがかなりの手抜き実装
      • パッチかこう・・・

DependencyInjection

  • ExtensionごとにContainerBuilderインスタンスが生成されて後からマージされる問題
  • CompilerPassでやるのか?
  • Yamlでon-invalidate="ignore"
    • @?logger
    • nullはない(テストケースを見る限りおそらく仕様)
  • DefinitionDecorator
    • 定義の継承的なことをする
  • Scopeをもっと調べなければ・・・

FOSUserBundle

  • すげえ


現時点でのベストプラクティスを探るのであればFriendsOfSymfonyやKnpLabsなど有名どころのバンドルをみるのがよいでしょう。