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冊でしょう。

Tags: php, symfony, book, validation

まだPHPの配列の仕様をよく理解されていない方へ

PHPを使いもせずDISってる君達へ - Qiita」という記事がありました。

概ね正確な内容ですが、まだ根本的にPHPの配列の仕様がわかっていないような記述が一部に見受けられました。端的なものが以下です。

今まで話したようにPHPには配列型と辞書型は曖昧なものです。

およそプログラミング言語の実装において型が曖昧ということはありえません。内部的には型は厳密です。でなければ実装できません。

ただし、自動的に型が変わることがあり、ユーザの理解が曖昧だと、言語の仕様も曖昧に感じるということです。

ということで、PHPの配列についてよく理解していないPHPユーザもまだいるでしょうから、仕様について少し記事を書くことにします。

PHPの配列とは?

PHPの配列について知っておくべきことは以下ではないかと思います。

  • PHPの配列はarray型の1つしかない
  • PHPの配列は順番を保持している
  • 配列のキーの型は整数と文字列しかなく、両者は区別される
  • 配列のキーには暗黙の型変換が起こる!

配列のキーの暗黙の型変換

さて、問題です。以下の結果は?

<?php

$a = [
    '1' => 'one',
];

$b = [
    1 => 'one',
];

var_dump($a === $b);

答えはtrueです。

何故なら、$aのキー'1'は、整数にキャストされるからです。

$aをダンプして見ると、以下のように、ちゃんと整数になっています(1の前後には"はありません)。

array(1) {
  [1]=>
  string(3) "one"
}

他にもfloat、bool、nullの値をキーに指定した場合、暗黙の型変換が起こりますが、ユースケースは少ないのではないかと思います。気になる人は PHPマニュアル を参照してください。

まだ、信じていない人がいるかも知れませんので、似たような問題をもう一つ。以下の結果は?

<?php

$a = [
    '1' => 'string',
    1   => 'int',
];

var_dump($a);

これは、どちらのキーも同じ整数の1なので、後に記述されている要素で上書きされます。

array(1) {
  [1]=>
  string(3) "int"
}

さて、次の問題です。以下の結果は?

<?php

$a = [ "*" => "asterisk",  "@" => "atmark" ];
$b = [ "20" => "twenty",  "30" => "thirty" ];
$c = array_merge($a, $b);

var_dump($c);

これは以下のようになります。array_merge()では、キーが整数の要素は0から振り直されます。

array(4) {
  ["*"]=>
  string(8) "asterisk"
  ["@"]=>
  string(6) "atmark"
  [0]=>
  string(6) "twenty"
  [1]=>
  string(6) "thirty"
}

整数のキーと文字列のキーは扱いが異なることがわかります。

整合性について

直接関係ないですが、以下のラスマスさんの言葉は、なかなか興味深いものです。

私たちがPHPの整合性のなさを直さないと言ってよく非難する人がいますが,PHPはそもそもそれが問題になるようなものではないのです。PHPは結局,ライブラリやその他基盤となっているテクノロジーへのショートカットにすぎません。それなのに,どうして誰もがPHPレベルでの整合性を求めるのか,私には分かりません。整合性をとるのはフレームワークの役割です。
http://gihyo.jp/news/report/2015/12/1401?page=4 より。

この考えに従えば、PHPの関数の引数の順番や(プログラマのバックグランドによっては)わかりにくい仕様などはマニュアルを読めばいいだけの本当にどうでもよいことです。

ユーザが実際に使うのはフレームワーク(Packagistで提供されるようなパッケージも含んでそう呼んでいると思われます)です。何故、さっさとそういうパッケージを書かないのか?ということになります。

このラスマスさんの考えに賛同するかどうかはともかく、実際にPHPでの開発はフレームワーク上でOOPで行われているものが大部分であり、PHPの内部関数を直接扱う機会はどんどん減っていることは事実です。

参考

Tags: php

【再】CodeIgniter 3のアプリのコードレビュー募集中

CodeIgniter Advent Calendar 2015 の12日目です。まだ、空きがありますので、興味のある方は気軽に参加してください。

CodeIgniter 3.0がリリースされましたので、『CodeIgniter徹底入門』に掲載されているアプリをCodeIgniter 3.0対応にアップデートしました。

このアプリのコードレビューを以前から募集しているのですが、ほとんど反応がないので、このアドベントカレンダーをお借りして、再度、告知をさせていただきます。

コメントや修正すべき点などありましたら、GitHubの Issues に投稿するか、Pull Requestをお願いします。

なお、書籍に掲載されているソースをこのようにGitHubで公開したり変更したものを配布することができるのは、この書籍のコードがオープンソースライセンス(修正BSDライセンス)で公開されているからです。ライセンスに従う限り著作者の許可なく自由に再配布可能です。とくにそういうことになっていない書籍のコードは著作者の許可なく配布することはできませんので注意してください。

『CodeIgniter徹底入門』について

『CodeIgniter徹底入門』についてご存じない方は、以下のページをご覧ください。

『CodeIgniter徹底入門』のアプリ

もともとのアプリはCodeIgniter 1.6.1用に書かれたものでしたが、CodeIgniter 3.0への移行は完了し、テストもだいたい追加し、ある程度リファクタリングしました。

▼テストカバー率

コードレビューのお願い

どなたでも興味のある方、このアプリのコードレビューをしてください。コメントや修正すべき点などありましたら、GitHubの Issues に投稿するか、Pull Requestをお願いします。

もし、コードをレビューしたけどとくにコメントすべきことはなかったような場合は、上記のリポジトリに「★Star」を付けてもらえると、誰もまったく見ていないのか、見ている人はいるのかがわかり、ありがたいです。

関連

Tags: codeigniter, book