Rのつく財団入り口

ITエンジニア関連の様々な話題を書いているはずのブログです。

【感想】『速習 Laravel6 速習シリーズ』【PHP】

Laravel6の最速本

 PHPフレームワークでもうデファクトとなったLaravelの最新版、6を扱った本。
技術書では安心の山田祥寛さんの手軽に読める速習シリーズです。2019年9月刊行となっています。Laravel6のリリースも2019年9月ですね。

速習 Laravel 6 速習シリーズ

速習 Laravel 6 速習シリーズ

Part1: イントロダクション

 PHPフレームワークの歴史が述べられており、Phrame、MojaviAgaviEthnaMapleの名が出てきます。Ethnaは古いシステムの保守とかの話でどこかで聞いたような……?
 2000年代に一世を風靡したJavaフレームワークであるStrutsに歴史を受けたものもあるとのことで、PHP界隈にもそんな時代もあったんだなあ……となります。
 その後は2005年にRuby on Rails登場でWeb開発に衝撃を与え、Railsに影響を受けた直系のSymphony, CakePHP, Zend Framework, CodeIgnither。そしてSymphonyを土台に持って別に再開発されたのでで枯れて安定しつつかつ新しい、Laravelの時代ですね。

f:id:iwasiman:20200912190709p:plain
四角の組み合わせの公式ロゴが、いつの間にか立体になってました!

Part2: Laravel開発の準備

 本書ではWindows10、XAMPP、ライブラリ管理のComposer経由でのインストールで構築する環境になっています。
ディレクトリ構造図が載っていますが、見たところLaravel5.*系と変わっていないようでした。

Part3: Laraveの基本

 /route/web.php にルーティングを書いて、Controllerクラス実装、Bladeテンプレートに画面を実装、Modelクラスを実装して接続先は /config/database.php に定義、簡単なCRUD画面を実装していく章。
 この辺も馴染み深いのですが、基本で使えるRDBSQLite/MySQL/PostgreSQL/SQLServer、実はLaravelはOracle未対応なんですね。PythonDjangoOracleがあってSQLServerがないのと逆になっています。

Part4: ビュー開発

  • 変数埋込は {{ $msg }} で二重カッコ、何気にDjangoやVue.jsと同じ。
  • Bladeテンプレートでのコメントは {{-- --}}
  • PHP構文が呼び出せるディレクティブが @if とか @while とかいろいろ。@foreach ~ @endforeach など、カッコを書かなくてよいのが独特。
  • ビュー置き場のディレクトリで aaa.blade.php を削除して aaa.php だけ置くと、BladeテンプレートをやめてPHP構文だけでもテンプレートを書けるのは面白い。
  • @yield@section を使って親子関係のレイアウトを埋め込むことも可能。
  • 画面内の一部を「コンポーネント」として resources/views/components/**.blade.php で定義、値を渡しつつ埋め込んだり。このへんも他の主要フレームワークと同様の機能があります。

Part5: ルーティング

route/web.phpRoute::get(....) Route::post(....) などで定義していくルーティングの話。

  • パラメーターも任意にしたり値に制約を付けたり可変にしたり、柔軟に定義可能。
  • 接頭辞を付けたり名前空間を付けたりもできる。
  • Route::resource(....) メソッドを使うことで、RESTful APIなURLルートも自動定義できる。

Part6: コントローラー開発

  • アクションメソッドの戻り値によく return Response(...)-> のように使うResponseヘルパー。繋げて一緒にメソッドチェーンで呼び出せる機能が豊富に揃っている。ヘッダーを加えたりJSONを出力したりファイルダウンロードに使ったり。
  • リダイレクトは戻り値に redirect() メソッドを使う。
  • リクエストはアクションメソッドに index(Request $req) のように引数を追加。このリクエストの中から画面のフォームの値、アップロードファイルなどを取得可能。
  • /app/Http/Middleware ディレクトリにミドルウェアのクラス定義、設定ファイルに追加すると、アクションの前後に決まった処理をインジェクションできるミドルウェアの機能がある。追加方法が複数あって柔軟。

 JSONを返したりファイルダウンロードしたりする仕組みは、僕もPHPで書くときにライブラリ的に共通化したり、社内の案件で実績を重ねつつある自作の軽量フレームワークでも手順を示してサポートしたりしています。でも改めてこうして見ると、やっぱりLaravelの方が抽象化が進んでいてコード量がより少なくて済んでいます。くっ、悔しいけどさすが世界のララベルですわね(ギギギw

Part7: 状態管理

  • Responseオブジェクトのメソッド呼び出しでクッキー保存、Requestオブジェクトのメソッドでクッキー取得。
  • セッションは /config/session.php で設定、デフォルトだとファイルに保存でこれが普通。PythonDjangoはここがデフォルトがDBになってたのが思い出されます。Requestオブジェクトのメソッドからセッション操作が可能。
  • エラーメッセージなど1回だけ戻す値を「フラッシュ」と呼び、これは redirect() メソッドのメソッドチェーンで一緒に設定。画面のテンプレート側ではvalue属性に old() 関数を使うことで、チェック前の直前の入力値を保持できる。

Part8: データベース連携(データの取得)

  • artisanコマンドを使ってテーブルを準備したり、Seederファイルでテストデータを準備したり。このへんのマイグレーションRailsDjangoなど他のフレームワークでも似たような機能を持っています。
  • ModelクラスはActiveRecordアーキテクチャパターンで、Book::where() のようにいろんなメソッドで条件を指定可能。グループ化や範囲指定、OR条件で繋げるなども含めいろいろできる。
  • SQL文を書きたい場合は DB::select("select * from user") のように書ける。
  • テーブル間のリレーションが必要な場合は、Modelクラスに所定のメソッドで書いて設定。

 エンプラ界隈の実際の開発では正規化されてテーブルも一式揃った本格的なRDBを使うことがほとんどで、僕もSQL文をガンガン書く方です。こうしたフレームワーク側が提供する実装でDBにアクセスできる仕組みは、見るたびにこっちの方が良いのだろうか、むむむ……となります。
RailsDjangoもLaravelも基本ActiveRecordパターンだし、.NET CoreにもEntity Frameworkという仕組みがあるし、Javaも途中からサードパーティの流行を逆輸入してJava Persistence API (JPA) という仕組みを言語側で用意したんですよね……。
 以前にLaravelを割と本格的な案件で使った時はModelクラスも使ったのですが、検索画面などの複雑なSELECT文などだとやはり耐えられなくなってきて、SQL文を記述する方式を採っていました。本書にあるように、生のSQL文とModelクラスと両方使い分けるのがいいのかなあと思います。このへん実際にお使いの方はどうなのか聞いてみたかったりもします。

Part9: データベース連携

 最後は1テーブルをCRUDする書籍情報フォーム開発の例。

  • Requestの fill()を使うと、{要素名} => {値} の組をModel層にまとめて渡せて便利。これを「マスアサインメント」と呼ぶ。
  • 逆に、この項目は渡さないというexcept()メソッドもある。
  • こうして不要なデータまで上書きされてしまう問題を「マスアサインメント脆弱性」と呼ぶ。
  • 入力画面の項目チェックはModelクラスのメンバ変数 $rules連想配列{項目名} => {ルール1:引数|ルール2|ルール3} のように文字列の組で指定。
  • ビュー側には変数 $errors で自動的に渡ってくるのでこれを表示。
  • 最後にエラーメッセージの日本語化の方法が載っています。GitHubで公開されているそうです。 validation.php{検証ルール} => {日本語メッセージ} で指定、項目名の英語と日本語の対応も同じファイルに指定、/resources/lang/ja に保存。最後にアプリケーション自体の設定を /config/app.php で日本語に変えて適用。

「マスアサインメント脆弱性」という用語は本書で知りました。1項目1項目を気にせず手軽なModelクラスを使っているとこういう問題は起こりそうですね。Ruby on Railsも4から対策がなされているそうです。

まとめ:最新(の1つ手前)のLaravel6を手軽に概観できる本

 内容は基礎的なところが主だったからか、Laravel5と違うLaravel6独特のところは自分的にはあまり見当たらなかったかな?という印象です。そうこうしている間に2020年3月に次のLaravel7がリリースされてしまいましたが、ほぼ最新のフレームワークの基本が手早く押さえられる手軽な本です。
 WINGSプロジェクト公式サイト内のページで、正誤表やサンプルコードもダウンロードできます。

wings.msn.to

Laravelの最近の本

PHPフレームワークLaravel入門 第2版』が、様々な言語やフレームワークや技術の入門本を出している掌田津耶乃さんの本。2019年12月でこちらもLaravel6対応となっています。1版は誤植が多めだったのですがそのへんは治っているでしょうか……?

PHPフレームワーク Laravel入門 第2版

PHPフレームワーク Laravel入門 第2版

PHPフレームワーク Laravel実践開発』が同じく掌田津耶乃さんの本。ややこしいですが2019年7月刊行、上の2版でなく下の1版の続きとなっています。こちらはLaravel5.8.9準拠で応用的な機能やテスト、JSフロントエンドのフレームワーク3種との連携など実践的な内容。

PHPフレームワーク Laravel実践開発

PHPフレームワーク Laravel実践開発

PHPフレームワーク Laravel入門』掌田津耶乃さんの本の1版で2017年9月、Laravel5.4準拠。こちらはじっくり読んだので当時感想記事を上げました。ちょっと誤植やコードの誤りが気になりますが基本は網羅できます。2020年現在に買うなら上の第2版+実践開発本ですね。

iwasiman.hatenablog.com

PHPフレームワーク Laravel入門

PHPフレームワーク Laravel入門

PHPフレームワーク Laravel Webアプリケーション開発 バージョン5.5 LTS対応』ががっしりしたテンプル本、2018年9月刊でLaravel5.5LTS対応。リリース後も修正が入るような本格開発向けの実戦本です。

『Laravelエキスパート養成読本 [モダンな開発を実現するPHPフレームワーク!]』が今となってはだいぶ古い2015年4月、Laravel5準拠のムック本。
海の向こうのアメリカではLaravelがぐんぐん伸びている中、日本ではまだCakePHPやSymphonyなどなど主要FWが幾つかあり、日本でもこれからLaravelが来るよ……という流行前夜の頃合いでした。

iwasiman.hatenablog.com

 有名になった割に商業本が少ないLaravelですが、まあ現在では日本語の公式サイトやQiitaの情報などもかなり手に入るようになりました。本で読むなら本書の『速習 Laravel6』か、『PHPフレームワークLaravel入門 第2版』+同『~実践開発』でしょうか。