a-blog cms PHP API Reference

AttachedFilePathResolver
in package

フォームの添付ファイルのパスを解決する。

field[x@path] / field[x@baseName] はリクエストで運ばれ、確認画面 (ACMS_POST_Form_Confirm::modifyAttachedFile)ではコピー元・削除対象、送信 (ACMS_POST_Form_Submit)ではメール添付の読み出し元として使われる。両方の唯一の 入口がここなので、アーカイブ領域の外を指す値の拒否もここに集約する。

責務は Field から値を取り出して AttachedFilePath へ渡すこと、@path を アーカイブ領域からの相対パスへ揃えること、拒否ログを出すことに限る。値の形式に 関する規則と、添付ファイルに対する判定・操作は AttachedFilePath 自身が持つ。

Why not file 型のサニタイズ(FileFieldHandler)に任せない: あのハンドラは POST に {fd}:extension がある場合だけ呼ばれる opt-in の経路 (FieldExtractor::extractResult())で、リクエストから :extension を省略すると @path / @baseName は POST の値のまま Field に残る。

「同一リクエストでアップロードされたファイル」の一覧はリクエスト単位のグローバル状態 (Entry サービス)なので、ここでは参照せず引数で受け取る。テスト時に任意の一覧を 差し込めるようにするためでもある(Authorization と同じ設計方針)。

Table of Contents

Properties

$archivesDir  : string
$temporaryDirectory  : string

Methods

__construct()  : mixed
resolve()  : AttachedFilePath|null
添付ファイルのパスを解決する
rejectionMessage()  : string
拒否ログの文言を組み立てる
toRelativePath()  : string
`@path` をアーカイブ領域からの相対パスへ揃える

Properties

Methods

__construct()

public __construct(string $archivesDir, string $temporaryDirectory) : mixed
Parameters
$archivesDir : string

アーカイブ領域のパス(ARCHIVES_DIR)

$temporaryDirectory : string

アーカイブ領域からの一時ディレクトリの相対パス

resolve()

添付ファイルのパスを解決する

public resolve(Field $field, string $fieldKey, array<string|int, string> $uploadedPaths) : AttachedFilePath|null
Parameters
$field : Field

抽出済みのフォームフィールド

$fieldKey : string

{フィールド名}@path 形式のキー。それ以外は対象外

$uploadedPaths : array<string|int, string>

同一リクエストでアップロードされたファイルのパス一覧

Return values
AttachedFilePath|null —

対象外・拒否した場合は null

toRelativePath()

`@path` をアーカイブ領域からの相対パスへ揃える

private toRelativePath(string $path) : string

Why not 存在チェックだけで公開領域基準の解決を許さない: アーカイブ領域を取り除く分岐は V2(Twig)フォームがパスをルート相対(アーカイブ領域を含む)で出力するためのものだが、 条件が「カレントディレクトリ基準で存在すること」だけだと index.php のような アーカイブ領域の外の既存ファイルにも一致してしまう。

Parameters
$path : string

@path の正規化後の値

Return values
string

        
On this page

Search results