引き続きAlgolia + PowerCMSシリーズです。使うかどうかは別として研究材料に良いと思い、Algolia連携を題材にプラグインを書き続けています。
これまで、編集画面で学校モデルを保存した時、CSVインポートをした時、タスクを実行した時にAlgoliaのインデックスに登録する機能を実装してきました。Algoliaに登録するコード、Algoliaから返ってきたJSONに含まれるobjectIDを学校モデルに保存するコードなど、同じか似通ったコードが出てきたので、機能毎に関数化して呼び出すように改善しました。モデル名が変わった場合にも対応できるようになり、汎用化が進みました。
ただ、モデルのオブジェクトをAlgoliaに登録する情報に変換する部分だけが共通化できそうにありませんでした。単純なテキストフィールドではなくリレーションの場合もありますし、複数のテキストフィールドを1つのキーに収める可能性もあります。そこで、この部分だけを別ファイルにし、なおかつ汎用的なコードで呼び出すことができないかと考えました。
MakeRecordクラスにモデル名で関数を作って呼び出す
新たにcustomize/MakeRecord.php
を作成し、以下のようにクラス・関数を書きました。クラス名がかぶることはないかと思いますが、念の為名前空間を付けておきました。(WordPressプラグインを作ったときにレビューで指摘を受けました。)
<?php
namespace AlgoliaSupport;
final class MakeRecords {
public static function school( $app, $object ) {
$saved_object_id = $object->algolia_object_id ? $object->algolia_object_id : '';
$record = [
'id' => (int) $object->id,
'name' => $object->name,
'address' => $object->address,
'tel' => $object->tel,
'objectID' => $saved_object_id,
];
return $record;
}
}
このコードを以前からあるプラグインファイル内(AlgoliaSupport.php
)で読みこむため、ファイルの冒頭でrequire_once 'customize/MakeRecords.php';
をします。そして、モデルのオブジェクトをAlgoliaに登録する情報に変換する部分で以下のように呼び出します。
private function make_records( $app, $model_name, $objects ) {
$records = [];
foreach ( $objects as $object ) {
$records[] = AlgoliaSupport\MakeRecords::$model_name( $app, $object );
}
return $records;
}
外部ファイルにモデル名を名称にした関数を書くという決まりにすることで、可変関数を利用した汎用的なコードにできました。環境毎に異なる内容が別ファイルになることで、プラグイン本体のバージョンアップも容易にできると考えています。バージョンアップ時にcustomize/MakeRecord.php
を上書きしないような工夫だけ必要かと思います。(Gitか何かで管理して頂ければ…)