a-blog cms PHP API Reference

Rule
in package

このクラスは、バージョンアップ時に「特別な更新処理」を行うためのクラスです。

注意点:

  • アップデート処理の実行時には、新しいバージョンで追加されたクラスやメソッドは、まだ読み込まれていないため利用できません。
  • そのため、このクラスでは 「オンラインアップデート機能」が追加された v2.8.0 から利用できる機能でのみ実装してください。

例 DB::next() は利用できません。v3.2.0 で追加されたため。

Table of Contents

Constants

CUSTOM_UNIT_CHUNK_SIZE  = 200
カスタムユニットのデータ移行で一度に取得するユニット数

Properties

$fromVersion  : string
$toVersion  : string

Methods

pickLatestLastAccessRows()  : array<int, array<string, mixed>>
last_access の行一覧からユーザーごとに最新の1行を選ぶ
update()  : mixed
例外的なアップデートを実行
addGroupConfig()  : mixed
フィールドグループのコンフィグを追加
addNavigationPublish()  : mixed
navigation_publish = on を追加
restoreCacheTablePrimaryKey()  : void
キャッシュテーブルの PRIMARY KEY を、欠落しているときだけ復元する。
restoreLastAccessPrimaryKey()  : void
last_access テーブルの PRIMARY KEY を、欠落しているときだけ復元する。 重複行をユーザーごとに最新の1行へ整理したうえで PRIMARY KEY (last_access_uid) を張り直す。
updateCustomUnitData()  : void
v3.2.0以前からのアップデート カスタムユニットのフィールドデータをcolumnテーブルからフィールドテーブルに移動
buildCustomUnitFieldRows()  : array<int, array<string, mixed>>
カスタムユニットのフィールドデータから field テーブルへ挿入する行を組み立てる
convertCustomUnitChunk()  : int
チャンク単位でカスタムユニットのフィールドデータを field テーブルへ移行する
convertCustomUnitData()  : void
カスタムユニットのフィールドデータを column テーブルから field テーブルに移動する
convertPrimaryKeyToSingleId()  : void
指定テーブルの PRIMARY KEY を ID カラム単体へ張り替える(冪等・重複ガード付き)。
filterArray()  : array<string|int, mixed>
配列を再帰的にフィルタリング
findConvertedCustomUnitKeys()  : array<string, true>
チャンク内ですでに field テーブルへ移行済みのユニットのキーを取得する
findCustomUnits()  : array<int, array<string, mixed>>
移行対象のカスタムユニットを主キー順にチャンク取得する
fixCacheTablesPrimaryKey()  : void
cache_data / cache_tag テーブルの PRIMARY KEY を復元
fixLastAccessPrimaryKey()  : void
last_access テーブルの PRIMARY KEY を復元
getCustomUnitKey()  : string
移行済みかどうかの判定に利用するユニットのキーを返す
insertCustomUnitFieldRows()  : void
組み立てた行を field テーブルへ挿入する
safeLog()  : void
Logger ファサードを防御的に呼び出す。
update140()  : mixed
v1.4.0以前からのアップデート コンフィグ画面用のconfigフィールドグループを追加
update142()  : mixed
v1.4.2以前からのアップデート Api_Yahoo_* の名前変更対応
update150()  : mixed
v1.5.0以前からのアップデート navigation_publish = on を追加
update2100()  : mixed
v2.10.0以前からのアップデート workflowを
update3150()  : void
v3.1.50以前からのアップデート フィールドにタイプのカラムを追加 メディアフィールドの検索用インデックスのため
update320()  : void
v3.2.0以前からのアップデート - カスタムユニットのフィールドデータをcolumnテーブルからフィールドテーブルに移動 - column_align カラムに存在する非表示を acms_column, acms_column_rev テーブルの column_status カラムのデータとして扱えるようにアップデート時にデータコンバートを行う
update321()  : void
v3.1.55以前からのアップデート
update3218()  : void
v3.2.18以前からのアップデート エントリーインポートのバグにより壊れたカスタムユニットのメディアフィールドの値を正しい値に修正する
update3225()  : void
v3.2.25以前からのアップデート
updateUnitAlignToStatus()  : void
v3.2.0以前からのアップデート column_align カラムに存在する非表示を acms_column, acms_column_rev テーブルの column_status カラムのデータとして扱えるようにアップデート時にデータコンバートを行う 配置は center に変更する

Constants

CUSTOM_UNIT_CHUNK_SIZE

カスタムユニットのデータ移行で一度に取得するユニット数

private mixed CUSTOM_UNIT_CHUNK_SIZE = 200

Properties

$fromVersion

protected string $fromVersion

$toVersion

protected string $toVersion

Methods

pickLatestLastAccessRows()

last_access の行一覧からユーザーごとに最新の1行を選ぶ

public static pickLatestLastAccessRows(array<int, array<string, mixed>> $rows) : array<int, array<string, mixed>>
Parameters
$rows : array<int, array<string, mixed>>
Return values
array<int, array<string, mixed>>

update()

例外的なアップデートを実行

public update(string $fromVersion, string $toVersion) : mixed
Parameters
$fromVersion : string
$toVersion : string

addGroupConfig()

フィールドグループのコンフィグを追加

protected addGroupConfig(string $group, array<string|int, mixed> $vals, null|int $bid[, null|int $rid = null ][, null|int $mid = null ]) : mixed
Parameters
$group : string
$vals : array<string|int, mixed>
$bid : null|int
$rid : null|int = null
$mid : null|int = null

addNavigationPublish()

navigation_publish = on を追加

protected addNavigationPublish(int $bid[, null|int $rid = null ][, null|int $mid = null ]) : mixed
Parameters
$bid : int
$rid : null|int = null
$mid : null|int = null

restoreCacheTablePrimaryKey()

キャッシュテーブルの PRIMARY KEY を、欠落しているときだけ復元する。

protected restoreCacheTablePrimaryKey(string $table, array<int, string> $primaryKeyColumns) : void
Parameters
$table : string

プレフィックス済みテーブル名

$primaryKeyColumns : array<int, string>

復元する PRIMARY KEY のカラム(複合キーは宣言順)

restoreLastAccessPrimaryKey()

last_access テーブルの PRIMARY KEY を、欠落しているときだけ復元する。 重複行をユーザーごとに最新の1行へ整理したうえで PRIMARY KEY (last_access_uid) を張り直す。

protected restoreLastAccessPrimaryKey(string $logicalTable) : void
Parameters
$logicalTable : string

プレフィックスを含まない論理テーブル名(SQL ビルダー用)

updateCustomUnitData()

v3.2.0以前からのアップデート カスタムユニットのフィールドデータをcolumnテーブルからフィールドテーブルに移動

protected updateCustomUnitData() : void

buildCustomUnitFieldRows()

カスタムユニットのフィールドデータから field テーブルへ挿入する行を組み立てる

private buildCustomUnitFieldRows(Field $field, string $unitId, int $bid, int $revId, bool $isRevision) : array<int, array<string, mixed>>
Parameters
$field : Field
$unitId : string
$bid : int
$revId : int
$isRevision : bool
Return values
array<int, array<string, mixed>>

convertCustomUnitChunk()

チャンク単位でカスタムユニットのフィールドデータを field テーブルへ移行する

private convertCustomUnitChunk("field"|"field_rev" $fieldTable, bool $isRevision, array<int, array<string, mixed>> $units) : int
Parameters
$fieldTable : "field"|"field_rev"
$isRevision : bool
$units : array<int, array<string, mixed>>
Return values
int —

移行したユニット数

convertCustomUnitData()

カスタムユニットのフィールドデータを column テーブルから field テーブルに移動する

private convertCustomUnitData("column"|"column_rev" $columnTable, "field"|"field_rev" $fieldTable) : void

カスタムユニットが大量にある環境でもメモリを使い切らないよう、主キー順にチャンク取得して処理する。 すでに field テーブルへ移行済みのユニットはチャンクごとに判定して除外するため、 処理が途中で中断した場合でも、再実行すれば移行できていないユニットだけを続けて処理できる。

Parameters
$columnTable : "column"|"column_rev"
$fieldTable : "field"|"field_rev"

convertPrimaryKeyToSingleId()

指定テーブルの PRIMARY KEY を ID カラム単体へ張り替える(冪等・重複ガード付き)。

private convertPrimaryKeyToSingleId(PrimaryKey $primaryKey, string $table, string $idColumn) : void

すでに ID カラム単体になっていれば何もしない。重複 ID が残っているテーブルは、 PRIMARY KEY 追加が失敗してアップグレードを止めてしまわないよう、スキップして警告ログを残す。

Parameters
$primaryKey : PrimaryKey
$table : string

プレフィックス無しのテーブル名

$idColumn : string

ID カラム名

filterArray()

配列を再帰的にフィルタリング

private filterArray(array<string|int, mixed> $data) : array<string|int, mixed>

Why not: Services/Logger/Filter に同等のロジックがあるが、このクラスからは呼ばない。 クラス冒頭の注意にあるとおり、アップデート処理は「差し替え前の古いコードが読み込まれた プロセス」で走る。Filter は LoggerServiceProvider がリクエスト初期に new するため、 ここに到達した時点で「古い Filter の定義がメモリに載っている」状態になる。ファイルが 新しくなっていても既に読み込まれたクラスは差し替わらないので、Filter へ委譲すると 新バージョンで追加・修正した挙動は効かず、シグネチャを変えた場合は fatal になる。

そのため重複を承知でインライン実装のままにする。ここを共通化したくなったら、まず 「アップデート実行時に旧定義がメモリに載っていても壊れないか」を確かめること。

Why not: match / アロー関数 / array_any() / str_contains() を使わない。アップデート処理は リクエスト開始時の古い index.php で走っており、読み込まれている config/polyfill.php も 古い版になる。array_any() の polyfill が入ったのは 3.2.0-alpha.5 なので、3.2.0 より前から アップデートすると undefined function で fatal になる。しかも update321() は setup 経由で 未実行の環境を救うためバージョン比較なしで毎回走るため、3.1.x からの更新で必ず踏む。 match とアロー関数は構文なので polyfill では救えず、古い PHP ではパースエラーになる。 クラス冒頭の「v2.8.0 から利用できる機能でのみ実装する」という制約どおり、素の PHP で書く。

Parameters
$data : array<string|int, mixed>
Return values
array<string|int, mixed>

findConvertedCustomUnitKeys()

チャンク内ですでに field テーブルへ移行済みのユニットのキーを取得する

private findConvertedCustomUnitKeys("field"|"field_rev" $fieldTable, bool $isRevision, array<int, array<string, mixed>> $units) : array<string, true>
Parameters
$fieldTable : "field"|"field_rev"
$isRevision : bool
$units : array<int, array<string, mixed>>
Return values
array<string, true>

findCustomUnits()

移行対象のカスタムユニットを主キー順にチャンク取得する

private findCustomUnits("column"|"column_rev" $columnTable, bool $isRevision, int $offset) : array<int, array<string, mixed>>

Why not: 直前のチャンクの column_id を条件(column_id > 前回の値)にした、いわゆるカーソル方式に しない。column_id は varchar だが、SQL ビルダーは数値に見える値との比較を column_id + 0 に 展開するため、比較は数値順、ORDER BY は文字列順という食い違いが起きる。その結果、文字列順では 後ろにあるのに数値としては小さい ID(例: '1976' は '10000' より文字列順では後ろだが数値では 小さい)が、カーソルが追い越した時点で二度と取得されず取りこぼされる。 column / column_rev はこの処理中に変化しないため、OFFSET でページングしても行がずれることはない。

Parameters
$columnTable : "column"|"column_rev"
$isRevision : bool
$offset : int

取得開始位置

Return values
array<int, array<string, mixed>>

fixCacheTablesPrimaryKey()

cache_data / cache_tag テーブルの PRIMARY KEY を復元

private fixCacheTablesPrimaryKey() : void

これらのキャッシュテーブルへの書き込みは INSERT ... ON DUPLICATE KEY UPDATE(DB キャッシュ ドライバ。page/config/field/module は既定でこのドライバ)で行われ、「1キー1行」の維持を PRIMARY KEY に依存している。3.2.24 以前の setup「インデックス修復」は PRIMARY を含む全 インデックスを削除する一方で PRIMARY を張り直さなかったため、実行歴のある環境では PRIMARY KEY を失い、以後の書き込みで重複行が蓄積してアップデート時の ADD PRIMARY KEY が失敗する。 last_access と異なり履歴を保持する必要のない純粋なキャッシュのため、重複解消は TRUNCATE で 十分(内容はアクセス時に自動再生成される)。

fixLastAccessPrimaryKey()

last_access テーブルの PRIMARY KEY を復元

private fixLastAccessPrimaryKey() : void

last_access への書き込みは INSERT ... ON DUPLICATE KEY UPDATE で行われており、 「1ユーザー1行」の維持を PRIMARY KEY (last_access_uid) に依存している。 PRIMARY KEY を失った環境では POST リクエストごとに同一ユーザーの行が増え続け、 last_access を結合するユーザー一覧に同一ユーザーが重複表示される。 重複行をユーザーごとに最新の1行へ整理したうえで PRIMARY KEY を張り直す。

getCustomUnitKey()

移行済みかどうかの判定に利用するユニットのキーを返す

private getCustomUnitKey(string $unitId, int $revId, bool $isRevision) : string
Parameters
$unitId : string
$revId : int
$isRevision : bool
Return values
string

insertCustomUnitFieldRows()

組み立てた行を field テーブルへ挿入する

private insertCustomUnitFieldRows("field"|"field_rev" $fieldTable, array<int, array<string, mixed>> $rows) : void

Why not: SQL::newBulkInsert() でまとめて挿入しない。バルクインサートは v3.2.0 で追加された メソッドで、この移行処理が走るのは v3.2.0 より前からのアップデート時、つまりクラス冒頭の 注意どおり「古い SQL クラスが読み込まれたプロセス」で実行される。ファイルが新しくなって いても既に読み込まれたクラスは差し替わらないため、undefined method で fatal になる。

Parameters
$fieldTable : "field"|"field_rev"
$rows : array<int, array<string, mixed>>

safeLog()

Logger ファサードを防御的に呼び出す。

private safeLog(string $level, string $message[, array<string, mixed> $context = [] ]) : void

アップデート処理はアップグレード元(旧バージョン)のアプリ文脈で実行されることがあり、 後発で追加された Logger サービスがコンテナに未登録の場合がある。ログ出力の失敗が アップグレード自体を止めないよう、クラス存在確認と例外捕捉で保護する。

Parameters
$level : string

'warning' または 'info'

$message : string
$context : array<string, mixed> = []

update140()

v1.4.0以前からのアップデート コンフィグ画面用のconfigフィールドグループを追加

private update140() : mixed

update142()

v1.4.2以前からのアップデート Api_Yahoo_* の名前変更対応

private update142() : mixed

update150()

v1.5.0以前からのアップデート navigation_publish = on を追加

private update150() : mixed

update2100()

v2.10.0以前からのアップデート workflowを

private update2100() : mixed

update3150()

v3.1.50以前からのアップデート フィールドにタイプのカラムを追加 メディアフィールドの検索用インデックスのため

private update3150() : void

update320()

v3.2.0以前からのアップデート - カスタムユニットのフィールドデータをcolumnテーブルからフィールドテーブルに移動 - column_align カラムに存在する非表示を acms_column, acms_column_rev テーブルの column_status カラムのデータとして扱えるようにアップデート時にデータコンバートを行う

private update320() : void

update321()

v3.1.55以前からのアップデート

private update321() : void

監査ログの秘匿化項目をマスク化

update3218()

v3.2.18以前からのアップデート エントリーインポートのバグにより壊れたカスタムユニットのメディアフィールドの値を正しい値に修正する

private update3218() : void

update3225()

v3.2.25以前からのアップデート

private update3225() : void

シーケンスで採番するテーブルのうち、ID カラム単体の一意制約を持たないテーブルの PRIMARY KEY を「ID カラム単体」へ張り替える。これにより、移設時のシーケンス未同期などで 同一 ID が重複採番される事故を DB レベルで防止する。

旧来の複合キーは db.index.yaml の定義に従って別インデックスとして自動追加されるため、 本処理は updateIndexs() では実行できない PRIMARY KEY の張り替えのみを担当する。 schedule は 1 件が年月ごとに複数行を持つ仕様のため対象外。

updateUnitAlignToStatus()

v3.2.0以前からのアップデート column_align カラムに存在する非表示を acms_column, acms_column_rev テーブルの column_status カラムのデータとして扱えるようにアップデート時にデータコンバートを行う 配置は center に変更する

private updateUnitAlignToStatus() : void

        
On this page

Search results