九保すこひ@フリーランスエンジニア|累計300万PVのブログ運営中
さてさて、過去に私は、「あ、これまた同じプログラム書かなきゃいけないのか・・・」という時は必ず、独自パッケージを作成して公開してきました。(さっきGitHubを確認してみたらレポジトリが144個になってたんで、Laravelパッケージは少なくとも100パッケージは超えてると思います)
で、そんな努力のかい(?)もあってか、現在はある機能が必要になっても(既存のLaravelパッケージに加えて)独自パッケージを使えばほとんどのことが実行可能になり、結果として最近はパッケージを作成する機会が減ってきてました。
でも、現在の開発で以下のようなテーマに直面することになったんです。
「マスターデータを効率的に準備したい」
と。
どういうことかというと、ウェブサイトによっては、例えば
- 会員タイプ(無料会員/有料会員)
- 支払いタイプ(クレジット/現金/非接触型ICカード)
- 独自エリア(店舗が存在している市区町村)
などといった、Key-Value形式のマスターデータを準備する必要があるんです。
もちろん少なければ問題ないんですけどたくさん用意しないといけない場合だと、いちいちMigrationとSeederを作ってコマンド実行しなくちゃいけないんで、なかなか手間がかかるんですね(切実)
もちろん、マスターデータをjsonとかに格納して読み込むだけでいいのならいいんですけど、問題なのは
「マスターデータをデータベースに格納してほしいと考えるクライアントさんも多い」
という事実です。
つまり、ご自身で今後マスターデータを更新したいんですね。
そうなると、さすがにサーバーにあるファイルをviで開いてjsonを更新・・・とはさせられない(←さすがに専門的すぎる)ので、やっぱりPHPMyAdminやadminerなどでデータ管理ができるようにしてあげたいわけです。
でも、やっぱりひとつずつテーブル作っていくのは時間がかかりすぎる。
ということで、今回の本題「Key-Value管理のパッケージを作った」につながるわけです。
すでにGitHubで公開してるので、今回はインストールから使い方をまとめたいと思います。
ちなみに名前は「QuickDict」です。
PythonのKey-Value形式のデータタイプ「dictionary」を参考にしました。
インストールする
いつものごとく、composerでインストール可能です。
composer require sukohi/quick-dict:1.*
Laravel 5.5以上なら自動的にパッケージの読み込み処理をしてくれるので、これで完了です。
準備する
インストールしたら、以下のコマンドで/configに専用ファイルをコピーします。
php artisan vendor:publish --provider="Sukohi\QuickDict\QuickDictServiceProvider"
これで、「quick-dict.php」というファイルが/configフォルダに作成されているはずです。
マスターデータの追加
では、「quick-dict.php」の中にKey-Value形式のマスターデータを格納していきます。
return [ 'colors' => [ 'red' => '赤', 'blue' => '青', 'black' => '黒', ] ];
あとは、以下のコマンドを実行すれば全て完了です!
「colors」というテーブルにデータが保存されているかと思います。
php artisan dict
このコマンドがやってくれるのは、以下の3つ。
- Migrationをつくる
- Seederをつくる
- 作成したMigrationとSeederを実行する
つまり、以下のようにデータベースをリフレッシュする場合でもマスターデータはきちんと登録されることになります。
php artisan migrate:fresh --seed
※ただし、コマンド実行時にも注意書きを表示してますが、Seederコマンドでマスターデータを管理するには、DatabaseSeeder.phpに作成したSeederを登録する必要があります。
また、以下のように新しいデータ(テーブル)が追加された場合でも、同じく「php artisan dict」を実行して下さい。すでに存在しているテーブルはスキップされるようになっています。
return [ 'colors' => [ 'red' => '赤', 'blue' => '青', 'black' => '黒', ], 'Phones' => [ 1 => 'iPhone', 2 => 'Android', 3 => 'Windows phone' ] ];
マスターデータの更新
次に、すでにあるマスターデータの中身を更新したい場合です。
例えば、さっきの例を使うとこんな感じです。
return [ 'colors' => [ 'red' => '赤', 'blue' => '青', 'white' => '白' // 黒を消して、白を追加 ] ];
こんな場合は、
php artisan dict:update colors
を使ってください。(colorsはテーブル名です)
※わざわざひとつのテーブルだけ更新できるようにしたのは、既にクライアントさんによって他のマスターテーブルが書き換わっている可能性を考慮しているからです。
もし、一気に全マスターデータを更新したい場合は、「–all」をつけて実行してください。
php artisan dict:update --all
※ もしくは、「マスターデータの追加」でも説明したように「DatabaseSeeder.php」にSeederを登録しているのであれば、「php artisan migrate:fresh –seed」を実行してもマスターデータを全て更新することができます。
マスターデータを取り出す
QuickDictにはマスターデータを取り出すヘルパー関数が用意されています。それは、
dict('*****');
です。
使い方は、config()などを同じで引数にキーを入れてあげるだけでOKです。
$data = dict('colors'); // データは、"Laravel collection"
また、ドットでキーをつなぐと直接中身を取り出すことができます。
echo dict('colors.red'); // 赤
さらに、複数のマスターデータを一気に取得することもできて、その場合はキーを配列にして使います。
$data = dict(['colors', 'phones']); echo $data->toJson();
おわりに
やっぱり独自パッケージを作るのって楽しいですね。
また、何かアイデアが浮かんだらLaravelでなくとも、JSとかPythonでパッケージを作っていきたいと思います。
ぜひみなさんの役に立てると嬉しいです。
ではでは〜。