『Laravelリファレンス』を読んだ/Laravel雑感

入手自体はかなり早かったんですが、サンプルコードを試す機会を逸していてレビューが遅れました。。。

Laravelとは

Laravelは、2016年現在、最も人気のあるPHPフレームワークといってよいと思います。個人的には、Laravelの特徴は以下の3点だと思ってます。

(1) 高機能なフルスタックフレームワーク

PHPには、「フルスタック」を標榜するフレームワークがいくつもありますが、その中でもLaravelは高機能な部類に入ります。Symfonyという、それ自体高機能なフレームワークのコンポーネントを、さらに拡張するような作りになっています。私は現在は主にSymfonyを使用していますが、「この機能Symfonyにもほしい!」というものが結構あります。

(2) 変化の速さ

Laravelは変化の速いフレームワークです。メジャーバージョンの遷移は以下のようになっていて、メジャーバージョンが上がる毎に大きな設計変更が行われています(出典:https://ja.wikipedia.org/wiki/Laravel)。

  • Laravel 1: 2011年6月
  • Laravel 2: 2011年11月
  • Laravel 3: 2012年2月
  • Laravel 4: 2013年5月
  • Laravel 5: 2015年2月

Laravel 5.1では、初のLTS(Long Term Support)となり、3年間のサポートが提供されることが決まりました。しかし、SymfonyのLTSとは異なり、LTSでも機能追加が行われていたりします。また、現在の最新版は5.2です。

(3) エッジなターゲット

Laravelは、「そのバージョンがリリースされた時点で公式サポートされているPHP」を、動作対象バージョンの指標にしているようです。Laravel 5.1ではPHP 5.5.9以上が対象になっています。また、Laravelに最適されたPHP開発環境のHomesteadは、v0.4.0以降ではPHP 7.0がインストールされています。

Laravelリファレンスについて

Laravelリファレンスは、その名の通り「リファレンス」という色合いが強いです。以下が目次ですが、初心者向けは1章と2章です。8章はチュートリアル形式ですが、Laravelの基本機能を触ってみるというよりは、Laravelの機能を活かしつつ、最近採用が増えているレイヤードアーキテクチャの実践をやってみよう、といった応用的な内容です。

Chap.01 Laravelの概要
Chap.02 Laravelの基本
Chap.03 データベース
Chap.04 フレームワークの機能
Chap.05 フレームワークの拡張
Chap.06 テスト
Chap.07 実践的なアプリケーション構築
Chap.08 Laravelの実践

タイトルに「リファレンス」とあるとおり、通読する本というよりは、ざっと目を通して、後で必要になった時に調べる本だと思います。Laravelにどんな機能があるか眺めるには便利です。

また、サンプルコードも全てgithubで公開されています。第8章のサンプルコードなどは、書籍の方では解説が割愛されている部分でも工夫を凝らした実装がされていたりするので、一度眺めてみると良いと思います。

Laravelの優れた機能

個人的に気に入ったLaravelの機能をいくつか挙げていこうと思います。

マイグレーション

データベース定義をPHPソースコードで記述することができます。コードで記述されていることから、ロールバックが容易です。個人的に、DB定義はMySQL WorkbenchでER図を書いて、このER図に基いてSQLを作ることが多いです。この形式は、ドキュメント(ER図)からDB定義ができるという点では非常に便利ですが、ソースコードでDB定義が管理できることには別の便利さがあります。

Secure by defaultなクエリビルダ

これはSymfonyのORM(Doctrine)のクエリビルダとの比較になるのですが、LaravelのORM(Eloquent)は、より安全に書けるようになっています。

Doctrineのクエリビルダで単純にクエリを書くと以下のようになります。

この書き方には、潜在的なSQLインジェクションの脆弱性があります。eq()メソッドの第2引数の値はエスケープされず、プリペアードステートメントも使われないため、$nameにSQL文が入っていた場合はそのクエリが実行される可能性があります(Doctrineのソースコード)。

Doctrineでの正しい書き方は以下のようになります。この書き方だとプリペアードステートメントが使われます。

これに対して、Eloquentは以下の書き方でプリペアードステートメントが使われます。何も注意しなくても、デフォルトで安全に使えるようになっています。

FormRequestによるバリデーション

LaravelにはFormRequestという仕組みがあります。これは、コントローラーの手前でバリデーションを行う仕組みです。
FormRequestでは、各アクションに応じて、IlluminateFoundationHttpFormRequestクラスを拡張したクラスを作成します(titleを必須・最大文字数255、bodyを必須に設定)。

このEntryStoreRequestを使ったコントローラーの実装は以下のようになります。

バリデーションルールに合致していないリクエストが送られてきた場合、FormRequestが自動的にエラーのレスポンスを返します。バリデーションとエラー通知の責務をコントローラーから分離することができます。

Laravelのイマイチなポイント:メタプログラミングの多用

上述したように、Laravelには優れた機能が多くありますが、Laravelでは気持ちよくコードが書けないと感じることも多いです。その理由は、メタプログラミングの多用にあります。

Laravelの特徴の一つであるFacadeを使うと、以下のような記述ができます。

Config::get()は静的メソッド呼び出しですが、Configというクラスが存在するわけではありません。config/app.phpに以下のような設定がされています。

この設定に基いて、PHPのclass_alias関数によって「Config」というクラスの実体がIlluminateSupportFacadesConfigであると定義されています。このクラスからさらにサービスコンテナへの問合せが行われ、最終的にIlluminateConfigRepository::get()メソッドが呼び出されます。

このように複雑なメタプログラミングが使用されていることから、静的解析を主に用いているIDEとの相性は良くありません。ide-helperプラグインを用いて、クラス定義を静的に書き出すことでFacadeなどはIDEの補完が効くようになりますが、それでも限界はあります。以下は『Laravelリファレンス』8章のサンプルコードをPhpStormで開いているところのスクリーンショットですが、orderBy()に未定義メソッドの警告が出ています。

laravel_orderBy

ここで使用されているIlluminateDatabaseEloquentBuilder::where()は自分自身を返しますが、IlluminateDatabaseEloquentBuilderは自分が持っていないメソッド名が呼び出されると、__call()メソッド内部でIlluminate/Database/Query/Builderの機能を呼び出します。Illuminate/Database/Query/BuilderがorderBy()を持っているので、これが呼び出される、という流れになっています。

このように、頻繁に使用するメソッドでも補完が効かないことがあるのは地味につらいところです。

まとめ

『Laravelリファレンス』について、というよりはLaravelについての方が話が膨らんでしまいましたが、『Laravel』リファレンスはLaravel 5を使い始めるにあたって、まず手元に置いておきたい1冊だと思います。分厚い本ですが、リファレンス的に使うことを考えると、紙の方が良いと思います。

Laravel リファレンス[Ver.5.1 LTS 対応] Web職人好みの新世代PHPフレームワーク

『基本からしっかり学ぶSymfony2入門』を読んだ

基本からしっかり学ぶ Symfony2入門

本書は、PHPフレームワークSymfonyの入門書。

Symfonyとは

Symfonyは、PHP製のWebアプリケーション・フレームワーク。PHPのフレームワークの中でも、PHPコミュニティに対する影響力の大きさという点で特筆に値する。コンポーネントの疎結合化とDIコンテナによるコンポーネントの統合、Composerによる各コンポーネントの管理など、PHP 5.3以降のPHPフレームワークの多くで取り入れられている要素は、Symfonyに端を発している(※)。

※:Symfonyが採用している設計思想はSymfonyオリジナルのものではないけれど、Symfonyはこれらの設計思想に基づいたコンポーネントを使いやすい形で提供することで、コミュニティに影響を与えている。

また、コンポーネント単位の再利用が可能であることから、Drupal等のCMSや、コマンドラインツール、さらにはSymfonyコンポーネントの上に作ったフレームワーク(Laravel)まで、Symfonyコンポーネントを利用したプロダクトも多数登場している。

Symfonyの難しさ

Symfonyは、上述したように、影響力の大きさや、コンポーネント単位での再利用のしやすさ等の良さがある一方で、重量級のフルスタックフレームワークにありがちな、機能が多いがゆえの難しさもある。

Symfonyのドキュメントはかなり充実しているが、元々の機能が多い上、柔軟性を高めるために複雑になっている機能もあり(特にSecurityコンポーネント)、初心者が簡単に使い始められるようにはなっていない。

自分としては、Symfonyを学ぶ最短ルートは以下のようになると思っている。

  1. The Symfony Bookを通読する
  2. Symfony Best Practicesを通読する

これらの分量を合わせると約250ページ程度で、フレームワークの入門資料としては適度な分量のように思える。ただ、日本人の開発者にとって問題なのは、これらのドキュメントが全て英語で書かれていることである。日本語ドキュメントは存在するが、対応バージョンが古いのが難点。少なくとも、ドキュメントを読んで理解できる程度の英語力が無いのであれば、Symfonyを採用すべきではない。悩ましいのは、たとえ英語が読める人でも、日本語を読むのに比べると英語を読む速度はかなり落ちるということ。

入門段階から英語力が必須になる点が、Symfonyを学ぶ上での大きな課題だと感じていたところに、『基本からしっかり学ぶSymfony2入門』が出た。

『基本からしっかり学ぶSymfony2入門』の概要

『基本からしっかり学ぶSymfony2入門』は、日本語で書かれた、Symfony 2.7の入門書。主著者の後藤 秀宣(@hidenorigoto)氏は、知る人ぞ知る日本Symfonyユーザ会のグル(導師)。そんな後藤さんの本ということで、事前の期待度は高かったのだけど、期待は裏切られなかった。

対応バージョンについて

Symfonyはつい先日2.8と3.0が出たばかりなので、「2.7なんて古いバージョンじゃん!」と思うかもしれないが、Symfonyの最近のバージョンは安定してきているので、2.7と3.0では、メジャーバージョンアップとしてふつうイメージするほどの違いはない。そうはいっても、3.0では一部のディレクトリ構造が変わっていたりするので(app/consoleがbin/consoleに移動する等)、本書の「写経」をする場合は、2.7の利用をおすすめする。

なお、Symfony 2.7はLTS(Long Term Support)と呼ばれるバージョンであり、そのサポートは2018年5月まで続く。本書の「賞味期限」も、同じくらいは持つのでは、と思っている。

構成

Symfony製のWebアプリケーションの作成を通して、Symfonyの使い方を学べるようになっている。Symfony公式ドキュメントにはWebアプリケーションを作るようなチュートリアルが存在せず、非公式の「ブログチュートリアル」の類も、対応バージョンが古いという問題を抱えているものが多かった。

その点、本書は2.7という十分に新しいバージョンで、丁寧なチュートリアルが行われている。

項目の面からも、初心者がまず知るべきトピックは網羅されている。

  • ルーティングとアクション
  • テンプレートエンジンTwig
  • ORマッパーDoctrine
  • ログイン機能
  • Form
  • 外部プラグイン(SymfonyではBundleと呼ぶ)
  • DIコンテナ(Symfonyではサービスコンテナと呼ぶ)
  • 設定ファイル
  • コンソールアプリケーション
  • ユニットテスト・機能テスト

内容

詳しさでは、The Symfony Bookには一歩譲るし、Symfony Best Practicesの内容が全て網羅されているわけでもない。そういう意味で、公式ドキュメントの代替になるわけではない。

しかし、公式ドキュメントの通読に比べて、本書は圧倒的に速く読める。それでいて、Symfonyを使いはじめるのに必要な点はきっちり網羅されているので、Symfony入門の敷居を劇的に引き下げている。

自分がSymfonyを学び始めた今年の7月頃に、この本が出ていれば…と思わざるをえない。これからSymfonyを学ぼうとしている人には、本書を強くおすすめする。

Windowsフォームを丁寧に学べる本(ただしC#既修者に限る) – 書評:『10日でおぼえるC#入門教室』

10日でおぼえるC#入門教室 (10日でおぼえるシリーズ)

本書はC#とWindowsフォームの入門書。Windowsフォームというのは、Windowsデスクトップアプリを作るための技術の1つ。もう1つ新しい技術としてWPF(Windows Presentation Foundation)があり、実はWindowsフォームは既に新規機能の追加は(公式には宣言されていないが、事実上)停止している。

では、Windowsフォームを学ぶ必要がないのか、というとそうでもなく、Windowsフォーム製の既存資産を流用するにはWindowsフォームの知識が必要だったりする。

本書はWindowsフォームでGUIを作る→GUIを制御するC#コードを書くというレッスンの繰り返しで学習していくスタイルになっている。C#のコードの部分はそれなりに解説があるけれど、『スラスラわかるC#』のように、言語仕様だけに的を絞って解説している本に比べると、ややわかりづらい点は否めない。

また、内容的にも、単に言語仕様を解説するだけでなく、適切なクラス設計へのリファクタリングや、堅牢なアプリケーションを作るためのユニットテストの書き方などが含まれている。ユニットテストの書き方などはとてもありがたいが、C#入門の1冊目でここまでやるのは結構つらいのでは。

『スラスラわかるC#』の書評でも書いたけど、1冊目は言語仕様に的を絞った本を読んで、本書のようなGUIの作り方を解説している本は2冊目以降に読むのがおすすめ。

Amazonのレビューを見ると、「難しい」という意見が多いが、C#の基礎を身に着けてからだと、「Windowsフォームの操作の説明が丁寧でわかりやすかった」という印象が強い。ただ、確かにコード部分はレイアウトの問題もあって、若干読みづらい。あと、これはC#の標準的なスタイルなのかわからないが、フィールドを定義するより先にそのフィールドを操作しているメソッドが結構あって、C#の言語仕様的にはOKなんだけど、読みづらいコードだなあと感じる。

レッスンごとに新しくプロジェクトを作る、というスタイルは、必然的に操作に慣れることになるのでとてもよかった。

C#の入門書としてはおすすめできないが、Windowsフォームの入門書としては(他にライバルがいないというのもあるけど)おすすめ。

C#5.0入門書の決定版 – 書評:『スラスラわかるC#』

スラスラわかるC# (Beginner’s Best Guide to Programmin)

一通り読み終えたので、感想も兼ねて書評を。

タイトルでも書いた通り、本書は、C#5.0の入門書として、日本語で読めるものの中ではベストだと思う。C#は結構言語仕様が大きくて、便利機能がたくさんある反面、覚えることも多い。

C#入門者の多くはWindowsでデスクトップアプリが作りたくて学び始めると思うけど、GUIの作り方とC#の書き方を並行して覚えるのはかなり大変。急がば回れで、まず言語仕様を押さえてから、GUIの作り方を学んだほうがよいと思う。

本書『スラスラわかるC#』の良いところは、解説を言語仕様に絞って、適切なボリュームで、十分なサンプルコードとともに説明しているところ。

言語仕様解説のコンパクトさなら『パーフェクトC#』のほうが上だけど、コンパクトすぎてサンプルコードが少ないという問題がある(その割に結構詳しいことまで解説しているので、行間を補いながら読む必要があり、プログラミング経験者でも、C#未経験の場合は読みこなすのが難しい)。

なお、表紙を見ると「プログラミング知識ゼロでも大丈夫」的なことが書いてあるが、鵜呑みにしないこと。これでプログラミング入門は相当難しい。逆に、ifとかforとかいった制御構造にやたら分量をとっていたり、オブジェクト指向とは…的な内容を延々語ってたりすることがないので、プログラミング経験者でも無駄なく学ぶことができる。

今年にはC#6.0が出るけど、それほど大きな言語仕様の変更があるわけではないので、あと2, 3年は本書の価値は失われないはず。

.NET Frameworkのクロスプラットフォーム戦略は、Javaが20年前に通った道をこれから歩むのか…って感じでちょっとつらそうだけど、C#にはUnityという強力なサポーターが生まれたし、C#の言語仕様は静的型付けのオブジェクト指向言語の中ではかなり先進的(Java8には2014年に入ったラムダ式を、C#は2007年のC#3.0でサポートしていた)。Windows環境があるなら、学んで損はない。

『自分のペースでゆったり学ぶ TCP/IP』を読了

[改訂新版] 自分のペースでゆったり学ぶ TCP/IP

3分間ネットワーク基礎講座』シリーズの網野衛二氏が、『3分間ネットワーク基礎講座』よりもさらに初心者向けにやさしく書いた入門書。

タイトルには「TCP/IP」とあるけど、物理層からアプリケーション層まで、OSI参照モデルの全レイヤーを扱っている。1冊を通して読むことで、TCP/IPでデータがネットワーク上を流れる際の「流れ」を概観することができる。

具体的には、以下のような流れ(HTTPの場合)。

  1. クライアントがHTTPのプロトコルに基づいたリクエストを発信する
  2. トランスポート層でリクエストに宛先と送信元のポート番号がつけられ、スリーウェイハンドシェイクのデータが用意される
  3. インターネット層でデータに宛先と送信元のIPアドレスがつけられ(IPパケット)、LAN内のルータに送信される
  4. インターフェイス層で宛先と送信元のMACアドレスがつけられ(イーサネットフレーム)、宛先のルータに送信される
  5. ルータにデータが届くと、イーサネットヘッダが外される
  6. ルータはインターネット層でIPヘッダを確認し、自分が宛先でない場合はルーティングを行って新しいMACアドレスをつけ、別のルータに転送する
  7. 宛先のルータにデータが届くと、イーサネットヘッダ・IPヘッダが取り外され、スリーウェイハンドシェイクのレスポンスを返す
  8. スリーウェイハンドシェイクが完了すると、サーバはリクエストされたデータを返す

逆に言えば、上に書いたような流れがすでに理解できている人は読む必要がない。第6章で流れがまとめられているので、読むかどうか迷っている人は、まず第6章を読んで、知っていることしか書いてないようなら別の本を読んだほうがいい。また、プロトコルやヘッダの実際については書いていないので、具体的なヘッダの中身等が知りたい人にも向かない。

ターゲットがきっちり定まってて、対象読者なら読めば学びがあるし、読む必要が無い人は読まずに済ませられるという点で、かなり良書だと思う。

また、随所に「○○を忘れてしまった人はxxページ参照」というリンクがちりばめられているので、ゆっくり読んで前に学んだ内容を忘れてしまっても大丈夫。本の作りは、技術書というよりも学習参考書に近い。