5分でわかる

Symfony Best Practices

 

アシアル株式会社 社内勉強会

2015/12/10

宇都宮 諒

  • Symfonyを使う上でのお作法集
  • 必ずしもこれに従う必要はないが、設計に迷った時の指針になる
  • Best Practicesに合わせるために、既存のアプリケーションの設計を変える必要はない

本資料について

  • Best Practicesの簡略版
  • 対応するSymfonyのバージョンは2.7
  • Symfony Installerを使用してプロジェクトを作成する
    • Symfony Installerは、symfony.comからアーカイブをダウンロードする
      • composerより高速
      • GitHubのリクエスト制限にも引っかからない
  • アプリケーションには、AppBundleというBundleを1つだけ作成する​
    • 他のプロジェクトと共有しないビジネスロジックはAppBundleにまとめる
    • 他のプロジェクトでも再利用したい部分は独自にBundle化してもOK
  • app/config/parameters.yml
    • ​DB設定等、動作の基盤となる設定
    • 環境ごとに変わる可能性がある値
  • ​app/config/parameters.yml.dist
    • ​環境ごとの変化がない値
  • ​app/config/config.yml
    • ​アプリケーションの振る舞い(dev/prod等)に関する設定
  • ​変更の可能性が低い値は、ymlではなくクラス定数で定義する
  • サービスコンテナの設定はymlで記述する
    • app/config/services.yml
  • Doctrineのエンティティのマッピングはアノテーションを使用する
  • アプリケーションのコントローラーには、FrameworkBundleのControllerを継承させる
    • ​コントローラーでフレームワークとの結合度を低めても意味が無い
  • ルーティングはアノテーションを使う
  • ​@Templateアノテーションを使うべきではない​
  • 複雑なデータ取得が必要な場合、@ParamConverterアノテーションの使用を推奨する
  • テンプレートエンジンはTwigを使う
  • app/Resources/views/ にテンプレートファイルを置く
  • テンプレート名にはlower case+snake caseを使う
    • the_template_name.html.twig
  • Twig拡張を作る場合、AppBundle/Twigに定義して、app/config/services.yml で設定する
  • フォームはPHPクラスとして定義する
    • FormBuilderによる動的な組み立ては使わない
  • ボタンはフォームクラスやコントローラーではなくテンプレートで追加する
  • 独自フィールドには app_ という接頭辞をつける
  • 翻訳ファイルにはXLIFF形式を使う
    • XLIFFはXMLを拡張した、翻訳のためのフォーマット
  • 翻訳ファイルはapp/Resources/translations/に置く
  • 翻訳ファイルのメッセージのキーには、コンテンツ自身ではなく、コンテンツの内容を示す文字列を指定する
  • 認証ファイアウォールは1つだけ設置すべき
    • 2つ以上のログイン手段がある場合は例外
  • ユーザーのパスワードの暗号化にはbcryptを使うべき
  • 認可は以下の方式で行う
    • security.ymlのaccess_controlを使ってURLのパターンマッチでアクセスコントロールを行う
    • コントローラーでは@Securityアノテーションを使う
  • CSS、JavaScript、画像ファイル等はweb/ディレクトリに置く
  • Asseticを使ってアセットのコンパイルやminifyを行う
    • gulp等のフロントエンドツールを別に使っているなら、Asseticを使う必要はない
  • 機能テストを作成し、少なくともページが正常にロードされるかテストすべき
    • 必要に応じて、より詳細な内容もテストする
  • 機能テストで使用するURLはハードコードすべき

※ユニットテスト(=ビジネスロジックのテスト)はSymfonyとは独立したものなので、Symfonyはユニットテストの実装方法については意見を持たない

One More Thing

  • SymfonyにBest Practicesがあるように、DoctrineにもBest Practicesがある!
  • そんなに大したことは書いてないし、分量も少ない
  • ここには書いてないが重要なBest Practiceもある
  • 例:
    • プレースホルダーを使う
    • 読み取り専用のデータ取得時はオブジェクトではなく配列かスカラーでハイドレーションする
    • QueryBuilderでは文字列ではなくexpr()メソッドを使う
    • (使える場面では)Referenceを使う
  • リレーションはできるだけ減らす
  • 複合キーを避ける
  • イベントの利用は慎重に
  • CASCADEの利用は慎重に
  • テーブル・カラム名等に非ASCII文字は使わない
  • コレクションはコンストラクタで初期化する
  • 外部キーのフィールドをマッピングしない
  • できるだけ明示的にトランザクションを使う
    • Doctrineは暗黙的にトランザクションを行うが、本当に必要なところでは明示的にやるべき

おわりに

  • 本資料では、詳細を省いている部分も多いです
  • 本資料をとっかかりにして、Best Practicesを通読してみてください

ご清聴ありがとう

ございました