a-blog cms PHP API Reference

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


        
On this page

Search results