Skip to content

開発者ガイド

この章はシステムを拡張する人向けです。利用者向けの説明は利用ガイドにあります。

技術構成

採用技術
言語素の 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() の引数は参照渡しなので、変数でなければなりません。

php
hook(P, new X());              // 致命的な 500
hook(P, $this->getUser());     // 致命的な 500
hook(P, ['a' => 1]);           // 致命的な 500
$user = $this->getUser();
hook(P, $user);                // 正しい

しかも、その行が実際に実行されたときにしか落ちないので、テストで見逃しやすいです。

2. ライフサイクル属性は名前付き引数で書きます。

php
#[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 にしかありません。

MIT ライセンスで公開