黒橡開発室

R:050 G:044 B:040

『パーフェクト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を勉強しながら開発を進めながらという日々を送っていました(余談ですが先日無事本番リリースしました)

なんとか開発自体は回せたものの反省点もたくさんありました。
その中の一つとして大きかったのが、

自分は雰囲気でなんとなくフレームワークを使っている

というものです。
この数ヶ月間、なんとなく既存処理を追いかけ、なんとなくリポジトリクラスのメソッドを呼び出せば、なんとなくDBアクセスができて、なんとなくコントローラからビューに取ってきた値を渡してやればそれっぽいことが大体できる、くらいのレベルの理解度で実装をしていたので、これでいいのかな?本当はきちんとフレームワークの構造や機能を理解した上で最適な選択ができないといけないのでは・・・?ともやもや。
結果必要な成果物が期待通りの動作をしていれば確かにそれでいいのかもしれないのですが、この状況には結構な危機感を覚えました。

処方箋

ある日、しばらく会社の同僚に何冊か技術書を貸していたのが返ってくることになり、久々にこいつを読み返してみました。
gihyo.jp

はい、PHPerおなじみの『パーフェクトPHP』です。世の中にPHPに関する技術書はそれこそ星の数ほど存在していますが、この『パーフェクトPHP』にはちょっと面白い項目が収録されていまして、

上記サイトより
f:id:sakiware208:20201206173213p:plain

<中略>

なんとこの本フレームワークの作り方を説明した章があるのです。
フレームワークの使い方や環境構築について記載した本はたくさんありますが、
フレームワークとは?の説明をやってから、じゃフレームワーク作ってみましょうか。となる技術書は自分は今の所この本以外知りません(他にもそんな本があったら言語問わず是非知りたいです)

というわけでいてもたってもいられずこの本を片手にフレームワーク自作というか写経、やってみました。

環境構築

『パーフェクト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なんかは普段意識して使っていないので、自分で手を動かして実装していきながら本の内容をコメントでメモしながらやりながらちょっとずつ理解を深めていきました。

github.com

最小構成から考えるちょうどいいフレームワークのこと

今回作ったフレームワークは最小構成なので、このままだと開発に使うにはちょっと痒いところに手が届かない感じがする反面、
自分にとってこれは必要だなと思うcore機能は追加で実装したり、ライブラリを導入して欲しい機能だけをあとから拡張するのも面白そうだなと思いました。
まだ触ったことはないですがslimのようなマイクロフレームワークを導入して本当に必要なものだけで構成してみたり、ライブラリの設定を細かくみていけたりできるようになったら、
必ずしもLaravelのようなフルスタックフレームワークしか選択肢がない、みたいなことにはならないのかなあと思ったりもしました(Laravelは使いやすいので個人的に好きですが)

雰囲気でフレームワークを使わないようになるには?のヒント

若干話がそれましたが『パーフェクトPHP』のフレームワークの項目の最後にこんなことが書いてありました。

PHPを深く学習していく効率の良い方法は、ライブラリやフレームワークソースコードを読むことです。特にフレームワークにはwebアプリケーションを作成する上で必要となる様々な機能が盛り込まれています。

当面は今回作ったフレームワークの機能拡張を進めたり、良さそうなライブラリを組み合わせて使いやすい構成をいろんなパターン考えてみたり、
上記のように既存のフレームワークのソースを追いかけて普段使ってる便利なメソッドがどういう実装になっているのか調べたり、引き続き進めてみたいなと思います。
ある程度の研究成果がまとまったら何かしらの発表の場で報告できればと思います。