🦔

PHPでオレオレフレームワークを作る(車輪の再発明です!)

2023/02/05に公開

はい!車輪の再発明をしました!

作るきっかけ

私は、エンジニア歴5年目のWeb系バックエンドエンジニアです。
普段の業務では、PHPやPython・Java系・Golangなどの言語を扱います。
もちろん、以下のようなWebフレームワークを利用してシステムを作ります。

  • Laravel Symphony
  • Django
  • SpringBoot
  • Gin

PHPでは、Laravelのようなフルスタックフレームワークを利用することが多いです。
ただ、フルスタックフレームワークはとても便利だし、頻繁にアップデートもしてくれるので、業務で使う分には非常にありがたいのですが、、、
ちょっとしたテストなどでフルスタックフレームワークを利用するのは、オーバースペックすぎるし、余計なライブラリが大量に入ってしまうので、気持ち悪いなぁーと個人的には思っていました。

そこで「オレオレフレームワーク作ってみるか!」と思い立ち、開発に至りました。

どういうものを作るか?

まず、作ると言っても、車輪の再発明になってしまうことは確実なので、手の届く範囲で作りたいと考えました。

規模

趣味で作るものだし、あまり時間のかかるものは作りたくなかったので、開発において、以下のようなルールを決めました。

  • 1週間くらいで開発できる規模のものにする
  • 自力で可能なものは開発するけど、便利なライブラリは利用する
  • 目新しい技術のものは使わない

方向性

フレームワークと言っても色々なタイプがあると思います。
Laravelのようななんでもできるフルスタックフレームワークや、Slimのような基本的な機能はあるけど「あとはあなた自身でカスタマイズしてね!」みたいな、マイクロフレームワークなどです。

Slimは趣味で色々触ったりしていたのですが、色々なライブラリを使って自分で色々な機能を実装しないといけないイメージがあったので、今回作るものに関しては、最初からもう少しできることが多いものを作ろうと思いました。
具体的には、以下の機能は、最初から利用できるようにしようと思いました。

  • Httpルーティング
  • コンソールコマンド
  • サービスコンテナ

上記の機能をサクッと使えるようなフレームワークであれば、ちょっとした時に趣味レベルで使っていけるので、モチベーションが保てるのではないかと考えて、とりあえず、これらは実装しようと思いました。

参考にしたもの

フレームワークを作ると言っても、一人でフレームワークをイチから作った経験はないので、色々なフレームワークの実装を参考にさせてもらいました。

FW 参考にした内容
Laravel ルーティングとサービスコンテナ
Slim ルーティングとリクエスト/レスポンス
WordPress フック

実装内容についても参考にしたのですが、以下のような、仕様の部分で結構参考になる部分が多かったです。

  • WordPressはフック処理で色々コントロールできるようにして、カスタマイズを簡単にしてるんだなぁー
  • Slimは実装をPSRに準拠することで、色々な機能の入れ替えや、依存をコントロールしてるんだなぁー

Symphony Components is GOD

いやー、結果的になんですが、SymphonyのComponentsを結構利用しちゃってました(笑)
特に、コンソールコマンドについては、SymphonyのConsoleコンポーネントを使わなければ実装できなかったと思います。
それに、リクエストとレスポンスについても、SymphonyのHttpFoundationコンポーネントを利用しているので、Symphonyのコンポーネントがなければ、開発できなかったです!
あと、Laravelでも利用頻度が高いsymfony/var-dumperは神すぎる!

マジで神です!

Symphonyのコンポーネントを使えば、めちゃめちゃ捗る!
というか、これもうSymphonyでよくね?っていうツッコミは受け付けません。

フレームワークってなんだろう?

フレームワークを作るときに「フレームワークの主な役割/コアってなんだろう?」と考えました。
Laravelはサービスコンテナがコアになっていたり、SlimはHttpルーティングがコアになっています。

フレームワークの目的によって、コアになるものは様々だと思います。
私が作りたいものは、色々なサービスを外部から柔軟に取り入れることができるものなので、どちらかというと、Laravelのようなサービスの提供をコントロールできるものがコアになってるのが良いと思いました(サービスコンテナも作りたいと思ってたし)

とりあえず完成

フレームワークの方
https://github.com/takemo101/egg

フレームワークを使って作ってみたやつ
https://github.com/takemo101/egg-skeleton

とりあえず、目的は果たせたし、自己満足もできたので、めでたしめでたし!

反省点

とりあえず、勢いだけで作ってたので、色々反省点があります。

  • 基礎的な部分ですが、ちゃんと設計して開発していないので、最終テストしにくいクラスなどが出てきてしまった(やっぱテストファーストだなぁー)
  • PSRに準拠したものを作りたかったのですが、面倒そうだったので、途中でやめた(RequestとResponseクラスくらいは準拠してもよかったなぁーと)
  • 単純に途中で飽きてきた(どうせ便利なフレームワークいっぱいあるしなーっていう考えが沸々と)

オレオレは善か悪か?

私は、業務での開発で、趣味で開発したオレオレフレームワークみたいなものを導入したことがありました。
ただ、後々それが批判や罵声を受けるものとなりました。
私にとっては、とても便利で開発をサクサク進めてくれるものだったのですが、趣味で作ったものだったので、ドキュメントもなかったし(ドキュメントを書く時間もなかった)他人にとっては、非常に使いづらいものとなっていました、、、かなり反省しています。

オレオレを作るということは?

当たり前ですが、オレオレを作り導入するということは、オレ流を他人に強要することとなります。
皆さんも、ドキュメントの少ないOSSなどを使ったときに、かなりのストレスを感じた経験があるのではないでしょうか?アレと同じ現象のような気がします。

結論

私自身も、業務でオレオレの洗礼を受けたことはありますし、オレオレによって迷惑をかけたことがあります。
ただ、それでもオレオレってロマン溢れるよね!っていう感じです(笑)

車輪の再発明でもいいじゃない!
ただ、オレオレによって、他人に迷惑はかけないようにしたいよねって話でした!

Discussion