開発者ガイド
この章はシステムを拡張する人向けです。利用者向けの説明は利用ガイドにあります。
技術構成
| 層 | 採用技術 |
|---|---|
| 言語 | 素の PHP 8.0+ |
| データベース | Eloquent ORM(illuminate/database) |
| テンプレート | Smarty 3.1 と PHP ネイティブレンダリング |
| セッション | PHP セッション |
| ルーティング | 単一入口 index.php、?s=/パス で振り分け |
ディレクトリ構成
app/
Controller/ コントローラ:Admin(管理)、User(フロント)、Shared(連携)、Install
Service/ ビジネスロジック。注文・チャージ・発送は Service/Bind/ 配下
Model/ Eloquent モデル
View/ テンプレート。フロントのテーマは User/Theme/ 配下
Plugin/ プラグイン
Pay/ 決済プラグイン
Consts/Hook.php フックポイントの定数
kernel/ コア:ルーティング、アノテーション、プラグイン読み込み、ユーティリティ
config/ 設定ファイル(データベース接続など)
runtime/ 実行時キャッシュとログ拡張の 3 つの方法
| 方法 | 向いている用途 | ドキュメント |
|---|---|---|
| フック | 既存の処理に割り込む(注文後に通知、登録時にリスク判定など) | フック一覧 |
| プラグイン | 独自のページ・設定・ルートを持つ完結した機能 | プラグイン開発 |
| 決済プラグイン | 新しい決済事業者への対応 | 決済プラグイン開発 |
外部システムから商品取得や発注を行う場合は API リファレンスを参照してください。
始める前に知っておくこと
いずれも一度踏むと忘れられないものばかりです。
1. hook() の引数は参照渡しなので、変数でなければなりません。
hook(P, new X()); // 致命的な 500
hook(P, $this->getUser()); // 致命的な 500
hook(P, ['a' => 1]); // 致命的な 500
$user = $this->getUser();
hook(P, $user); // 正しいしかも、その行が実際に実行されたときにしか落ちないので、テストで見逃しやすいです。
2. ライフサイクル属性は名前付き引数で書きます。
#[Plugin(state: Plugin::INSTALL)] // 正しい
#[Plugin(Plugin::INSTALL)] // 何も起きないまま無視されます位置引数で書くと、プラグインは「有効化に成功」と表示されるのに、テーブル作成が一切実行されません。
3. update.php は新しいコードがコピーされる前に実行されます。
アップグレードスクリプトが動く時点では、新バージョンのファイルはまだ配置されていません。新バージョンにしか無いクラス・定数・メソッドを参照すると例外が起き、それは静かに握り潰されます。旧バージョンの API とリテラルだけを使ってください。
4. フックファイルを追加したら、プラグインを停止して再度有効化します。
runtime/plugin/hook はコンパイル済みの登録表キャッシュで、有効化時にしか再構築されません。ページの再読み込みでは反映されません。
5. テンプレートキャッシュを消すときは runtime/view/compile だけにします。
runtime/config は絶対に消さないでください。設定キャッシュであり、消すとサイト全体が壊れます。
デバッグ
問題が起きたら、まずサイトルートの runtime.log を読んでください(runtime/log/ ではありません)。
DEBUG=false の場合、捕捉されなかった例外は 404 ページとして描画され HTTP 500 で返されます。本当の原因は runtime.log にしかありません。
