PHPフレームワークの王道を学べる『基本からしっかり学ぶSymfony2入門』

この記事は、PHP Advent Calendar 2015 の24日目です。

著者の金本さんより献本いただきました。ありがとうございます。

2015/12/16にSymfony2の入門書である『基本からしっかり学ぶSymfony2入門』が技術評論社から発売されました。

本書は「Symfonyをマスターするための最短コース」と表紙に書かれていますが、確かに、Symfonyの全体像と使い方をコンパクトにまとめた優れた入門書と言えるでしょう。

ちなみに「王道」とは広辞苑によると「最も正統な道・方法」という意味だそうです(本書より)。

対象者

本書の対象者は以下です。

  • Webアプリケーション開発のスタンダードな知識を身につけたい人
  • Symfonyの基礎をつかみたい人
  • Symfonyの特徴を実践的に学びたい人

上記は書籍に記載されているもので、まったくその通りだと思います。

また、個人的に別の表現をすると、以下のような人向けかなと思います。

  • Symfonyに興味のある人
  • ほとんどのSymfonyユーザ

対象外なのは、

  • PHP初心者
  • Webアプリケーション開発初心者

です。PHPでWebアプリを書いたことがない人には内容が高度なので難しいと思います。

なぜ今Symfonyを学ぶのか?

あまりPHPに詳しくない方はご存じないと思いますが、現在のPHPの世界は、Symfony(プロジェクトのプロダクト)にかなり依存しています。SymfonyがPHP界をリードしているということもできるでしょう。

仮にSymfonyプロダクトが今なくなったとしたら、多くのフレームワーク、ライブラリはインストールすらできなくなります。なぜなら、多くのフレームワーク、ライブラリはComposerに依存しており、そのComposerはSymfonyコンポーネントに依存しているからです。

(ただし、CodeIgniterはZipファイルからインストールでき、動作にも全く影響しませんが。)

また、現在のPHPフレームワークのトレンドの1つとして疎結合が挙げられますが、これを決定付けたのもSymfony2です。

WordPress以外のほとんどのメジャーなCMSはSymfonyコンポーネントを使うように書き直されています。 Drupal、Joomla!、concrete5(以上3つはCMS)、Magento、Piwik、Goutte、Doctrine、phpDocumentor、これらはなんらかのSymfonyコンポーネントを利用しています。

本書では、以下のような説明がありました。

Symfonyの支持の多さは流行ではありません。純粋にソフトウェアのプロフェッショナルから見て、とても良くできているから支持されているのです。

このようにPHP界の特にプロフェッショナルから支持されているSymfonyを学ぶことで得られるものは多いと思います。興味のある方は学んでみるといいでしょう。

ただし、本書はSymfonyフレームワークの入門書であり、特定のSymfonyコンポーネント自体を学びたいという用途には直接的にはそれほど役立たないでしょう(扱っていないコンポーネントも多いです)。

読むのにどれくらいかかるか?

『土日でわかるPHPプログラミング教室』というPHPの入門書(かなり初心者向け)があるのですが、

その真似をすると、本書では、以下のようなカリキュラムで土日でSymfonyに入門できます。

  • 金曜日 第1〜2章(2時間)
  • 土曜日 第3〜6章(10時間)
  • 日曜日 第7〜9章(12時間)

はい、土日でというのはちょっと無理がありますね。

3日(8時間×3日)はかかりますね。それだけ、本書は内容が濃いということです。実際、扱っているトピックも結構多いです。無理せず読み進んでください。

せいぜい「3日でわかるSymfony2」と言うくらいが限界でしょうか。

書籍の内容について

第1章 PHPとフレームワーク

導入です。Symfonyの特徴や情報源が記載されています。

第2章 Symfonyの基礎

Symfony Installerをインストールし、demoアプリをインストールして動かします。コマンドやデバッグツールバー、プロファイラなどの使い方、そしてSymfonyアプリケーションの構成と処理フローを学習します。

第3章 アプリケーションの開発1 ページ作成の基本を身につける

Symfonyプロジェクトを作成し、Twigでページを表示します。

第4章 アプリケーションの開発2 テンプレートの整理とフォーム

テンプレートを部品化する方法とフォームについて学習します。問い合わせフォームのデータはGmailにメール送信します。

第5章 管理機能の開発1 データベースとの連携

Doctrineでエンティティを作成し、フォームとエンティティを連携させ、問い合わせフォームのデータをデータベースに保存します。

第6章 管理機能の開発2 フォーム入力チェックとユーザ認証の実装

エンティティにバリデーションを追加します。また、管理ページを作成し、Basic認証を付けます。

管理ページに問い合わせ一覧ページを作成し、管理用のフィールドを追加してそれを編集可能にします。1つのエンティティに問い合わせが送信された場合に入力されるフィールドと管理ページでのみ編集されるフィールドの2種類のフィールドがあるのでバリデーショングループを使います。

ルートパラメータから自動的にエンティティをコントローラに注入してくれる@ParamConverterも使います。

その他、問い合わせの検索ページを作成し、ここまでである程度のWebサイトの作り方が一通り完了です。

第7章 管理機能の拡張とAPIの開発

データベースフィクスチャを学習し、CSVダウンロード機能を追加し、コマンドの作成方法を学びます。

それから、FOSRestBundleを使い、JSON APIを開発します。NelmioApiDocBundleを使い、DocコメントからAPIドキュメントを生成し、APIのCORS対応もNelmioCorsBundleを使い実装します。

この章は非常に内容が盛りだくさんです。

第8章 サービスコンテナを使った開発

Symfonyでの重要コンポーネント、サービスコンテナについてより深く学習します。

第9章 テストの実装

PHPUnitを使い、ユニットテストとファンクショナルテストを作成する方法を学習します。

Appendix1 Symfonyチートシート

コマンド、コントローラ、Twig、フォーム、Doctrine、テストに関してのチートシートです。結構、重宝しますね。

感想

Symfonyの全体像、

  • リクエスト
  • カーネル
  • レスポンス
  • ルーティング
  • コントローラ
  • テンプレート
  • サービスコンテナ
  • ドメインレイヤ

がわかりやすく解説されていると思いました。Symfony入門書として良書と言えます。

また、

  1. ページ作成・テンプレート操作
  2. フォーム作成、メール通知
  3. エンティティ作成、データベース操作
  4. フォームとエンティティの連携
  5. バリデーションの追加

という流れで、非常に巧みな構成になっていると感心しました。

最初はデータベースを全く使わずに進みます。「モデル=ORM」というファットコントローラの原因となる誤解が生じる余地もなく、よくない癖が付く心配もありません。まさに、王道的な解説というべきでしょうか。

また、Symfonyはよくできていると感心します。とくにデバッグツールバー、プロファイラは本当に高機能ですね。

本書の巧みな構成とSymfonyのオブジェクト指向により、少しずつ機能が追加され別のオブジェクトと連携していきます。

また、1つのエンティティを2つの別のフォームから使う、1つのエンティティからWebページとAPIで少し違った形でデータを提供する、というような微妙な問題もアノテーションを使うなどでうまく扱われています。

それから、TwigについてはTwig本来の機能かSymfonyでの拡張機能かということまで丁寧に記載されていました。Symfony以外でTwigを使うことも多いので、混乱せずに済みますので、こういう丁寧な記述は非常によいと思いました。

各章の最後にチェックポイントという小さな問題があり、復習および理解度チェックに役立ちます。解答も巻末に載ってます。

一通り写経してみましたが、それほど詰まるところはありませんでした。

ただし、書籍の記述通りにインストールすると、最新のComposerパッケージがインストールされるため書籍のコードと互換性がないというケースが1箇所ありました。

写経する場合のアドバイス

ファイルを変更したのにページが変わらない場合は、まず、キャッシュをクリアしましょう。

$ php app/console cache:clear

Symfonyは使っているとやはり重さを感じますので、その場合は、PHP7を使うことをお薦めします。

インストールするComposerパッケージは、配布されている composer.lock のバージョンと互換性の保たれるバージョンを指定すると、バージョンの違いにより書籍のコードが動作しないという問題につまずかずに済むでしょう。

正誤情報 は事前に確認し、つまずいたら、ダウンロードしたソースコードと見比べ、GitHubのIssues を検索し、それでもダメなら、GitHubのIssuesで質問でしょうか。

扱っていないこと

Symfony内部のコード解説はほぼありません。あくまで入門書であり、Symfonyの基本構造、考え方、使い方にフォーカスしています。

また、DDD(ドメイン駆動設計)についての解説はありません。

テストについては、基本的な書き方の説明であり、最終章にあることから当然TDDではありません。また、カバー率も高くありません(手許では9.22%)。このあたりも入門的な内容で、ドメインレイヤのオブジェクトのユニットテスト、モックの使い方、コントローラのファンクショナルテストと最低限の内容をカバーしています。ただし、テストカバー率の取得方法はあったほうがよかったのではないかと思います。

問題点

もちろん完璧な書籍というものはなくて、本書にも細かい誤植や疑問点はいくつかありますが、大きな問題はないように思いました。

また、誤りなどはGitHubのサポートサイトでフォローされると思います。

お薦めポイント

  • 最新のSymfonyの入門書であるということ(バージョンは2.7)
    • 最新のSymfonyでの開発について学べます
  • 紙の書籍であること
    • 電子版もあります(GDP からはPDFとEPUBのセットが購入可能)
  • Symfonyの概要が短時間で学べること
  • 内容・解説が信頼できること
  • GitHubで質問できること

ということで、ほぼすべてのSymfonyユーザに本書をお薦めします。

ただし、もし、ご自分がSymfonyに関して著者よりもかなり高いスキルレベルに達している場合には、それほど得るものはないと思いますので、読むまでもないでしょう。

まとめ

『基本からしっかり学ぶSymfony2入門』はSymfony2の日本語で読める入門書として現在最良の1冊でしょう。

ほぼすべてのSymfonyユーザ、Symfonyフレームワークに興味のある人に本書をお薦めします。

最後に本書の宣伝文の中に「この1冊でSymfonyのすべてを知ることができます」というのがありますが、たぶん出版社の営業の人が飛ばしすぎたものでしょう。うっかり真に受けてしまう人はいないとは思いますが、言うまでもなく、この1冊でSymfony(フレームワーク)のすべてはわかりません。Symfonyはもっと大きく複雑なシステムです。

たぶんSymfonyのすべてを知るには、Symfonyの公式ドキュメント を読む必要があるでしょう。

  • Symfony_quick_tour_3.0.pdf ... 28ページ
  • Symfony_book_3.0.pdf ... 235ページ
  • Symfony_best_practices_3.0.pdf ... 45ページ
  • Symfony_cookbook_3.0.pdf ... 519ページ
  • Symfony_components_3.0.pdf ... 411ページ
  • Symfony_reference_3.0.pdf ... 420ページ

圧倒されますね。

本書(336ページ)はSymfony2の入門書として現在最良の1冊でしょう。

Date: 2015/12/24

Tags: php, symfony, book, validation