『パーフェクトPHP』を読んでフレームワークを作ってみた(継続中)
ゆるWeb勉強会@札幌 Advent Calendar 2020に今年も参加させていただきました。
こちらは上記アドベントカレンダー6日目の記事になります。
私は普段PHPを書いて何かすることが多いのですが、今回はPHPのフレームワークを自作してみた話について書いていこうと思います。
なんでフレームワーク自作?
今年の夏頃から数ヶ月、EC-CUBE4を使ったECサイト構築に関わることになりました。
doc4.ec-cube.net
現在のEC-CUBE4系ではPHPのフレームワークであるsymfony(確か3.4)が採用されており、案件では必然的にsymfonyをがっつり触ることになります。
ところが社内にはEC-CUBE4系もsymfonyも有識者はおらず、この数ヶ月は独力でsymfonyを勉強しながら開発を進めながらという日々を送っていました(余談ですが先日無事本番リリースしました)
なんとか開発自体は回せたものの反省点もたくさんありました。
その中の一つとして大きかったのが、
処方箋
ある日、しばらく会社の同僚に何冊か技術書を貸していたのが返ってくることになり、久々にこいつを読み返してみました。
gihyo.jp
はい、PHPerおなじみの『パーフェクトPHP』です。世の中にPHPに関する技術書はそれこそ星の数ほど存在していますが、この『パーフェクトPHP』にはちょっと面白い項目が収録されていまして、
上記サイトより
<中略>
なんとこの本フレームワークの作り方を説明した章があるのです。
フレームワークの使い方や環境構築について記載した本はたくさんありますが、
フレームワークとは?の説明をやってから、じゃフレームワーク作ってみましょうか。となる技術書は自分は今の所この本以外知りません(他にもそんな本があったら言語問わず是非知りたいです)
というわけでいてもたってもいられずこの本を片手にフレームワーク自作というか写経、やってみました。
環境構築
『パーフェクトPHP』は良書ではあるのですが、発行年が2010年ということもあり本書のサンプルの対応バージョンはPHP5.3となっています。
さすがにこの通りに作っていくわけにはいかないので、今回の環境構築ではdockerを使いつつ以下の通りやってみました。
- PHP7.3
- Apache2.4
- MySQL8.0
※LAMP環境構築に関して参考にさせていただきました
github.com
今回作るもの
とりあえず何も考えずに本書の通り進めます。自分なりにやったことといえばサンプルコードをPHP7.3の文法にちょいちょい書き換えたくらい。
ディレクトリ構成はこんな感じ
application/
└ controllers/
└ core/
└ models/
└ views/
└ web/
MVCはそのまんまなので割愛しますが、core配下にフレームワークとしての基本的機能を書いたクラスを入れていき、web/はドキュメントルートとして使用するイメージです。
ブラウザからアクセスできるのはこのweb配下のリソースだけに限定させます。
フレームワークに必要な要素?
そういえばフレームワークがフレームワークである為の要件ってなんなんでしょう?と聞かれて今の自分は明確な答えを持ち合わせていないのですが、
本書で作成するcore配下のクラス一覧を眺めているうちに「まあ最低限これがあるとフレームワークなんだろうなあ」という感想を持ちました。
core/
└ Request.php
└ Response.php
└ Router.php
└ DbManager.php
└ DbRepository.php
└ Controller.php
└ View.php
└ Session.php
└ Application.php
└ ClassLoader.php
リクエスト・レスポンス・リポジトリクラスあたりは「なんとなくフレームワーク開発」をしていても結構触る部分なのでイメージしやすかったのですが、
ClassLoaderなんかは普段意識して使っていないので、自分で手を動かして実装していきながら本の内容をコメントでメモしながらやりながらちょっとずつ理解を深めていきました。
最小構成から考えるちょうどいいフレームワークのこと
今回作ったフレームワークは最小構成なので、このままだと開発に使うにはちょっと痒いところに手が届かない感じがする反面、
自分にとってこれは必要だなと思うcore機能は追加で実装したり、ライブラリを導入して欲しい機能だけをあとから拡張するのも面白そうだなと思いました。
まだ触ったことはないですがslimのようなマイクロフレームワークを導入して本当に必要なものだけで構成してみたり、ライブラリの設定を細かくみていけたりできるようになったら、
必ずしもLaravelのようなフルスタックフレームワークしか選択肢がない、みたいなことにはならないのかなあと思ったりもしました(Laravelは使いやすいので個人的に好きですが)
雰囲気でフレームワークを使わないようになるには?のヒント
若干話がそれましたが『パーフェクトPHP』のフレームワークの項目の最後にこんなことが書いてありました。
PHPを深く学習していく効率の良い方法は、ライブラリやフレームワークのソースコードを読むことです。特にフレームワークにはwebアプリケーションを作成する上で必要となる様々な機能が盛り込まれています。
当面は今回作ったフレームワークの機能拡張を進めたり、良さそうなライブラリを組み合わせて使いやすい構成をいろんなパターン考えてみたり、
上記のように既存のフレームワークのソースを追いかけて普段使ってる便利なメソッドがどういう実装になっているのか調べたり、引き続き進めてみたいなと思います。
ある程度の研究成果がまとまったら何かしらの発表の場で報告できればと思います。