読者です 読者をやめる 読者になる 読者になる

MediaWiki エクステンションでファイルを扱う

この記事は mediawiki-1.22.3 を元に記述している。

MediaWiki には FileBackend なるクラスがある。ファイルを操作するためのものである。 ファイルはローカルファイルシステムにあるとは限らない。 例えば SwiftFileBackend クラスは OpenStack Swift をサポートする。 今回はローカルファイルシステムを扱いたいので、 FSFileBackend を使う。

$backend = new FSFileBackend(array(
  'name'           => 'hoge-backend',
  'wikiId'         => wfWikiId(),
  'lockManager'    => new NullLockManager(array()),
  'containerPaths' => array('fuga' => '/path/to/save/files'),
  'fileMode'       => 0644
));

とこのような感じで FileBackendインスタンスを作成する。 この $backend を通して、例えば mwstore://hoge-backend/fuga/test.txt を読むと /path/to/save/files/test.txt の内容が得られる。 mwstore://MediaWiki 側にハードコードされており、固定である。 hoge-backend は一意でなければならない。エクステンションの名前を含めるとよいだろう。 なお、 1.21 以降では $backend->getRootStoragePath()mwstore://hoge-backend が得られるので、エクステンションに mwstore:// からはじまるフルパスをハードコードすべきではない。

$root = $backend->getRootStoragePath();
// $root = 'mwstore://hoge-backend';

$res = $backend->create(array(
  'src' => "$root/fuga/test.txt",
  'content' => 'This is a pen'
));

echo $res->isOk() ? 'ok' : 'fail';

$res = $backend->copy(array(
  'src' => "$root/fuga/test.txt",
  'dst' => "$root/fuga/copy.txt"
));

echo $res->isOk() ? 'ok' : 'fail';

$res = $backend->move(array(
  'src' => "$root/fuga/test.txt",
  'dst' => "$root/fuga/move.txt"
));

echo $res->isOk() ? 'ok' : 'fail';

$res = $backend->delete(array(
  'src' => "$root/fuga/move.txt"
));

echo $res->isOk() ? 'ok' : 'fail';

$res = $backend->doOperations(array(
  array(
    'op' => 'delete',
    'src' => "$root/copy.txt"
  ),
  array(
    'op' => 'create',
    'src' => "$root/fuga/test.txt",
    'content' => 'This is an apple'
  )
));

echo $res->isOk() ? 'ok' : 'fail';

マニュアルを書きたいわけではないので、ここまでにしておく。 その他のメソッドやパラメータについては FileBackend.php を参照されたい。