FieldFileGarbageCollector
in package
カスタムフィールド image/file 型の物理ファイルのうち、どこからも参照されなくなったものを回収する。
削除候補の集め方は 2 系統ある。
- グループフィールドの行削除で孤児化した @path(collectOrphans()。DB の DELETE 前に収集する)
- 削除チェック・差し替えで extract() が Field のメタ情報 'removeOld' に積んだ予約(collectMarked()) 実際の物理削除は DB の DELETE → INSERT が完了した後に removeUnreferenced() で行う。 DB 更新後であれば「自分自身を参照から除外する」条件が不要になり、参照チェックが素直に書ける。
Why not FieldRepository に置いたままにしない: 永続化(save/load/delete)と「不要ファイルの回収」は 変更理由が異なり、FieldRepository の 624 行のうち 197 行を GC が占めていた。 save() からの呼び出しは 3 箇所だけで切り出しやすい。
Table of Contents
Properties
- $onMediaDelete : callable(string): void|null
- メディアファイルの物理削除を通知するコールバック(削除した実パスを1引数で受ける)
Methods
- __construct() : mixed
- Why not クラス内で ACMS_Hook を直接呼ばない: フック発火はグローバル状態(HookFactory / HOOK_ENABLE)へのアクセスを伴うため、呼び出し側の private メソッドに閉じる規約 (development-guidelines.md「サービス層」、範例 Services/HtmlPurifier)に従い、本クラスは 受け取ったコールバックを所定タイミングで呼ぶだけにする。既定 null は、コンテナを経由せず 直接 new する単体テスト・既存コードのためのフォールバック(フックを発火しない)。
- collectMarked() : array<int, array{path: string, type: "image"|"file"}>
- Field のメタ情報 'removeOld' に積まれた削除予約を収集する。
- collectOrphans() : array<int, array{path: string, type: "image"|"file"}>
- グループフィールド行削除で孤児化する @path のリストを収集する。
- removeUnreferenced() : void
- 削除候補パスのうち、field / field_rev テーブルのどこからも参照されていないものを物理削除する。
- deletePhysicalFieldFile() : void
- カスタムフィールド image/file 型のファイルを物理削除する。
- isReferencedByField() : bool
- 指定パスが field / field_rev テーブルのいずれかのレコードで使われているか判定する。
Properties
$onMediaDelete
メディアファイルの物理削除を通知するコールバック(削除した実パスを1引数で受ける)
private
callable(string): void|null
$onMediaDelete
Methods
__construct()
Why not クラス内で ACMS_Hook を直接呼ばない: フック発火はグローバル状態(HookFactory / HOOK_ENABLE)へのアクセスを伴うため、呼び出し側の private メソッドに閉じる規約 (development-guidelines.md「サービス層」、範例 Services/HtmlPurifier)に従い、本クラスは 受け取ったコールバックを所定タイミングで呼ぶだけにする。既定 null は、コンテナを経由せず 直接 new する単体テスト・既存コードのためのフォールバック(フックを発火しない)。
public
__construct([callable(string): void|null $onMediaDelete = null ]) : mixed
Parameters
- $onMediaDelete : callable(string): void|null = null
collectMarked()
Field のメタ情報 'removeOld' に積まれた削除予約を収集する。
public
collectMarked(Field|null $field) : array<int, array{path: string, type: "image"|"file"}>
extract() 内で FieldExtractor::markFieldFileForRemoval() によって積まれた削除候補を removeUnreferenced() と同じ形式のリストに変換して返す。
Parameters
- $field : Field|null
Return values
array<int, array{path: string, type: "image"|"file"}>collectOrphans()
グループフィールド行削除で孤児化する @path のリストを収集する。
public
collectOrphans(string $tableName, string $type, int|string $id, Field|null $field[, int|null $rvid = null ]) : array<int, array{path: string, type: "image"|"file"}>
save() の DB DELETE 前に呼び出す。DB に残っている @path 値のうち、 今回保存しようとしている Field に含まれていないものを「削除された行」とみなし、 パスと image/file の種別をペアで返す。
実際の物理削除は DELETE → INSERT 完了後に removeUnreferenced() で行う。
Parameters
- $tableName : string
-
'field' | 'field_rev'
- $type : string
-
'bid'|'uid'|'cid'|'mid'|'eid'|'unit_id'
- $id : int|string
- $field : Field|null
-
保存しようとしている新 Field
- $rvid : int|null = null
-
リビジョンID(field_rev テーブルの場合のみ使用)
Return values
array<int, array{path: string, type: "image"|"file"}> —削除候補パスのリスト
removeUnreferenced()
削除候補パスのうち、field / field_rev テーブルのどこからも参照されていないものを物理削除する。
public
removeUnreferenced(array<int, array{path: string, type: "image"|"file"}> $candidates) : void
save() の DELETE → INSERT 完了後に呼び出す。 DB 更新後なので自分自身の除外条件は不要。
Parameters
- $candidates : array<int, array{path: string, type: "image"|"file"}>
-
collectOrphans() と collectMarked() をマージした候補リスト
deletePhysicalFieldFile()
カスタムフィールド image/file 型のファイルを物理削除する。
private
deletePhysicalFieldFile(string $relPath, "image"|"file" $type) : void
Parameters
- $relPath : string
-
archives ディレクトリからの相対パス
- $type : "image"|"file"
isReferencedByField()
指定パスが field / field_rev テーブルのいずれかのレコードで使われているか判定する。
private
isReferencedByField(string $path) : bool
Parameters
- $path : string
-
検査するファイルパス(相対パス)
Return values
bool —いずれかのレコードが参照していれば true