Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .claude/skills/eccube-controller/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ vendor/bin/php-cs-fixer fix # PSR-12 整形・ライセン
- ❌ `#[Template]` 付きアクションの「エラー時に再描画される」を前提にレビュー判断 → ✅ `#[Template]` は配列を返したときのみ engage。Response/Redirect を返すパス(例: フォーム失敗で `redirectToRoute`)では描画されない
- ❌ 管理アクションを `%eccube_admin_route%` 配下以外に置く → ✅ admin ファイアウォール配下に置く
- ❌ 同一アクションで `executePurchaseFlow()` を複数回呼ぶとき 2 回目以降の `FlowResult` を無視する → ✅ 毎回 `hasError()`/`hasWarning()` の分岐を 1 回目と同じに揃える(共通化可)
- ❌ 配列が来る可能性のあるリクエスト値を `getString()` でスカラーに強制する → ✅ `InputBag` は非スカラーで例外を投げるため強制できない。`all()` で受けて型を検査する

---

Expand Down
1 change: 1 addition & 0 deletions .claude/skills/eccube-entity/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,3 +109,4 @@ if (!class_exists(Example::class)) {
- ❌ 金額を float で四則演算(丸め誤差)→ ✅ `bcmath`(`bcadd` / `bcmul` / `bccomp`、スケール 2)で計算する
- ❌ `create_date` / `update_date` を自前の `#[ORM\PrePersist]`(+`#[ORM\HasLifecycleCallbacks]`)でセット → ✅ コアの `SaveEventSubscriber`(グローバル Doctrine prePersist/preUpdate)が `method_exists` で `setCreateDate`/`setUpdateDate`/`setCreator` を自動セットする(`src/Eccube/Doctrine/EventSubscriber/SaveEventSubscriber.php`)。setter さえ生やせばよく、自前 PrePersist は二重実装になるので書かない
- ❌ 他エンティティ(特にコアの `Product`/`Customer` 等、自分で制御できない親)への関連で親削除時の挙動を未決定 → ✅ FK は既定で削除を止める(RESTRICT 相当)。未指定だと**退会・商品削除が FK 違反で失敗**したり孤児化する。`onDelete`(`SET NULL`/`CASCADE`)を指定するか、Service・プラグイン disable 等で後始末する(コアは `onDelete` を限定使用し[95 JoinColumn 中 2 件]、多くは Service 側で関連を整理している)
- ❌ `@deprecated` なゲッタを未使用と判断して削除する → ✅ CSV 出力項目(`dtb_csv`)のアクセサとして現役のことがあり、削除は仕様変更になる。先に CSV 定義と照合する
5 changes: 5 additions & 0 deletions .claude/skills/eccube-migration/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ bin/console doctrine:migrations:migrate --no-interaction
Entity 属性を足せば、新規は `schema:create`、既存は `schema:update` が拾う。
→ 例: PR #4912(Google アナリティクス機能)は `BaseInfo` にカラムを追加したが、
ALTER マイグレーションは作らず `schema:update` に委ねている。
> **ただし実際のコアには両方の前例がある**。`Version20260316234241` は `dtb_base_info` への
> カラム追加に対して `ALTER TABLE dtb_base_info ADD ...` を書いている。
> つまり「カラム追加にマイグレーションが付いている=規約違反」とは言い切れない。
> レビューで「マイグレーション欠落」「マイグレーション不要」を**断定しない**こと。
> 既定は不要(`schema:update` に委ねる)だが、既存行へ既定値を確実に入れたい等の理由があれば付けてよい。
Comment thread
coderabbitai[bot] marked this conversation as resolved.
- **マイグレーションを書くのは次の場合に限る**:
1. **マスタ/初期データの INSERT**(`mtb_*` のレコード、`dtb_block` / `dtb_mail_template` / `dtb_csv` 等への初期レコード投入)。
2. **`schema:update` が安全に扱えない構造変更**(カラムの**型変更・リネーム**、データ移行を伴う変更、
Expand Down
3 changes: 3 additions & 0 deletions .claude/skills/eccube-purchase-flow/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@ description: EC-CUBE 4.4 の受注処理(PurchaseFlow の Processor/Validator
メソッドを実装する**。PurchaseProcessor は `AbstractPurchaseProcessor` を継承すれば必要なメソッドだけ override 可。
- **`supports()` で早期 return**: フロー種別・`Order` か否か・店舗設定(`BaseInfo`)で適用可否を判定し、
対象外なら何もしない(`AddPointProcessor::supports()` が手本)。
- **トランザクション境界はリクエスト全体**: `TransactionListener` が `kernel.request` で `beginTransaction()`、
`kernel.terminate` で `commit()`、例外時に `rollback()` する。Processor 内の `flush()` は SQL を発行するだけで
**コミットではない**ため、在庫引当・採番の可視性や競合を論じるときは「flush 済み=確定」と読み替えないこと。
- **金額計算は `bcmath`**(`bcadd` / `bcsub` / `bcmul` / `bccomp`)。float 演算で組まない。
合計・税・送料・値引きの集計は `PurchaseFlow::calculateAll()` が各段階後に行うので、Processor 側は
**明細(Item)を足し引きする**ことに集中する(合計の手計算は不要)。
Expand Down
19 changes: 19 additions & 0 deletions .claude/skills/eccube-security/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,25 @@ description: EC-CUBE 4.4 の認証・認可・CSRF などセキュリティを
EC-CUBE は **個別アクションの `#[IsGranted]` ではなく、ファイアウォール+ロール+Voter** で制御する。
設定は `app/config/eccube/packages/security.yaml`。

> **`access_control` は `security.yaml` に無い。`src/Eccube/DependencyInjection/EccubeExtension.php`
> の `configureFramework()` が `prependExtensionConfig('security', ...)` で動的に注入している**
> (コード内コメント「security.ymlでは制御できないため, ここで定義する」)。生成されるのは次の 6 規則で、
> `ECCUBE_FORCE_SSL` が有効なら全規則に `requires_channel: https` が足される。
>
> | path | roles |
> |---|---|
> | `^/%eccube_admin_route%/login` | `IS_AUTHENTICATED_ANONYMOUSLY` |
> | `^/%eccube_admin_route%/` | `ROLE_ADMIN` |
> | `^/mypage/login` | `IS_AUTHENTICATED_ANONYMOUSLY` |
> | `^/mypage/withdraw_complete` | `IS_AUTHENTICATED_ANONYMOUSLY` |
> | `^/mypage/change` | `IS_AUTHENTICATED_FULLY` |
> | `^/mypage/` | `ROLE_USER` |
>
> **認可レビューで `security.yaml` だけを見ると、この 6 規則が見えず誤検出する。**
> 例: `^/mypage/` 配下は `ROLE_USER` が前提なので `getUser()` は非 null だが、
> これを知らないと「null 参照で 500 になる」と誤って指摘してしまう。
Comment thread
coderabbitai[bot] marked this conversation as resolved.
> 認可の穴を探すときは必ず `EccubeExtension.php` 側も合わせて読む。

- **firewalls** は 3 つ:
- `admin`: `pattern: '^/%eccube_admin_route%/'` — `Member`(管理者) を認証。`enable_csrf: true`、login throttling 有り。
- `customer`: `pattern: '^/'`(サイト全体)— `Customer`(会員) を認証。remember_me 有り。
Expand Down
1 change: 1 addition & 0 deletions .claude/skills/eccube-service/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ vendor/bin/php-cs-fixer fix # PSR-12 整形・ライセン
- ❌ 1 つの Service に無関係な処理を寄せ集める → ✅ 単一責任で分割
- ❌ `Request` を Service に渡す → ✅ 必要な値だけを引数で渡す
- ❌ ループ内で毎回 `flush()` → ✅ まとめて `flush()`(トランザクション境界を意識)
- ❌ `flush()` を確定として扱う → ✅ `TransactionListener` が 1 リクエスト=1 トランザクションで包み、コミットは `kernel.terminate`。`flush` は SQL 発行のみ

---

Expand Down
Loading