ログ日記

作業ログと日記とメモ

EC-CUBEをフルスクラッチでリニューアルした話

もう数年前の話なんだけれど、メモを残していなかったのでここに書き留めておく。



今から数年前、当時はPHP5でEC-CUBE2を使っていた。
そして、OSの更新期限が迫ってきていて、OS更新と共にPHP7にバージョンアップする必要があった。

EC-CUBE 2 は PEAR を使っていて、クラス名などもnamespaceが無い時代の作り方で作られていた。


ゼロから作り直すか、別のオープンソースのシステムを使うか、新しいEC-CUBEを使うか、有志が EC-CUBE 2 の PHP7対応をやってくれるまで待つか、自分でPHP7対応をするか、どうするか…。

心情としては丸ごと作り変えたい。
でもどれだけかかるか分からないので、最初は動いているプログラムを少しずつ移動させる形でPHP7対応をやっていき、全てのコードをチェックが終わったら移行完了、だいたい半年ぐらいかなという気持ちだった。



しかし実際に取り掛かってみると、DBの構造ごと丸ごと変更しないとダメだという気持ちが大きくなってきた。
そもそも今取り掛かっているECサイトは物販では無いのだ。予約期間の日数指定みたいな形でかなりのカスタマイズが入っている。新しいEC-CUBEや他のOSSを利用するくらいならゼロから作った方が早い、ぐらいのカスタマイズが入っている。

それを無理やり物販用のDBとプログラムを使って強引につじつまを合わせていることがずっと気になっていたのだった。



早く移行を済ませるよりもじっくり設計していいという了解を得て、旧DBを完全に捨てて新しいDB設計から始めることにした。
時間があるなら独自システムにした方が絶対いいしね。
新しい画面を追加するためにDBにページを登録なんていうまどろっこしいことをしなくても良くなるし、CSVの項目を増やすために複雑なCSV項目定義DBをチェックする必要もなくなる。
汎用性のあるシステムは、その汎用性を維持するためにかなりの労力が使われているからね。やりたいこと特化でいいならだいぶシンプルな作りになる。

最新のOSSならプラグインやhookが充実しているだろうけど、EC-CUBEの新しいバージョンでは過去にできたことが出来なくなっていたりして、むしろ機能が制限されていそうだった。他のOSSWordPressほどじゃないだろうしね。その点WordPressはhookできない箇所を探す方が難しいぐらいに至るところにカスタマイズポイントが設定されていて、そういう意味ではかなりすごいツールだ。


新しいDBを作るため、まずはER図を書くツールでEC-CUBEのDBをインポートして、見やすく並べ替える。
自分が把握してないテーブルが結構あったし、使っていないテーブルも結構あった。

旧DBのことはひとまず考えずに、今から新システムのDBを設計するという気持ちでやっていった。データの移行はプログラムで頑張る。DBはMySQLからPostgreSQLに変更。
制約を厳しくしたら多くの箇所でエラーが出たけれども、そこもプログラムで修正しながらPostgreSQLにインサートするように書いていく。

移行プログラムを書いているときに、既存DBのデータバグもいくつか発見した。旧DBで直せるものは先に直しておく。




新しいプログラムは
PHPの開発環境とライブラリと振り返りと近況 - ログ日記
ここに書いたように特にフレームワークを使わずに作った。
今でも毎日開発しているのでPHP9万行、JavaScript 1万7千行、テスト1万6千行ぐらいになってる。



作っているときは、自分の把握していない機能が結構あって、ちゃんと見積もれていなかった。主に集計やCSV、PDF系の機能をあまり把握していなかった。機能追加することも修正することも無かった機能についてはあまり把握してなかった。機能があること自体は知っていた(知らないものも少しあった)けれど、コードの具体例が頭に入ってなかったというか。


結局手を付けてからどれくらいかかったのか、たぶん1年半ぐらいだと思うが…。長い期間かけてやっとフルスクラッチのリニューアルが完了した。



実はDB設計で妥協したところがあって、本当はもう少し納得のいくまでDB設計を考えたかったんだけれど、DBが決まらないとプログラムも画面も何も進まないのでね…。
今思えば、少しもやもやしてベストではないけれど、悪くはない、物販DBを流用するよりは格段に良くなった、と言えるだろうか。

仕様を決められずに諦めた新機能とか、古い設計を引きずらざるを得ない部分も少しあったりして。
決済プログラムなんかは決済会社のライブラリが無かったのでEC-CUBEプラグインを見ながら自分でリトライ処理を書いたりして、なかなか神経を使う作業だった。



当時は妥当に思えた選択でも、今考えたら別の方法にしたい大きなものに、テンプレートエンジンの利用がある。
htmlspecialcharsを手で書くのもミスが出るし、普通はテンプレートエンジンを使うだろうということで、BladeOneを使うことにしたのだった。
今ならhtmlspecialcharsをチェックする自作のPHPStanプラグインがあるので、テンプレートエンジンを使う方がバグが起こりやすくなっている。管理画面で新しく作るページはテンプレートエンジン無しの素のPHPに置き換えていっている。

あとは、ちょっとDDDを試した痕跡がコードにいくつか残っている。最初に設計を固めずに、中途半端に試してしまった…。なんちゃってDDDの箇所がある。まあこれは最初から上手い設計ができるわけもなく試してみないと分からなかった部分でもあるので、仕方ないといえば仕方ない。



リニューアル時の切り替えは、特にトラブルが無かった。少しの時間だけ停止して、その間にDB移行からIP切り替えでリニューアル後のサイトを表示。何の問題も無かったと思う。
それでもしばらくは仕様考慮漏れの修正をやっていたかな?あまり切羽詰まった記憶がないので緊急の案件は無かったんだろう。

そんな感じで、EC-CUBEをリニューアルした新しいシステムは今も開発し続けている。