Lazuli

らずり

Beans というライブラリを作った

フレームワーク使うほどでもなく、でも素のコードではちょっとしんどいみたいなプログラムを書くときがある。
そういう帯に短し襷に長し的なのを作る用の俺々ライブラリを作った。
中二病のような名前だけど気にしない。

SapphireBeans
EmeraldBeans
GarnetBeans


以下、雑に説明していく。

SapphireBeans

データベースライブラリ。
Composer から app2641/sapphire-beans でダウンロード出来る。
適当な場所に database.ini を作り、DB_INI_FILE という定数を指定する。

[develop]
db = "hoge"
host = "localhost"
username = "root"
password = "root"
<?php
define('DB_INI_FILE', '/path/to/database.ini');


ヘルパークラスからデータベースに接続する。
コネクションメソッドを実行すると PDO のオーバーライドクラスがかえってくる。
データベースの build メソッドを使えばプリペアドステートメントSQL を発行出来る。

<?php
use Sapphire\Database\Helper;
$db = Helper::connection('develop');

// SELECT文
$sql  = 'SELECT * FROM user WHERE user.name = ?';
$user = $db->build($sql, array('fuga'))->fetch();

// UPDATE文
$sql  = 'UPDATE user SET name = :name WHERE id = :id';
$db->build($sql, array('name' => 'piyo', 'id' => 1));

EmeraldBeans

コマンドライブラリ。
Composer から app2641/emerald-beans でダウンロード出来る。
適当な場所にファイルを作り、LIB と APP という定数を指定する。
LIB はディレクトリへのパス、 APP はアプリケーション名を指定する。

<?php
define('LIB', __DIR__.'/library');
define('APP', 'App');

LIB に指定したディレクトリの直下に APP のアプリケーション名の空ディレクトリを生成する。

$ mkdir library/App

次に、コマンド起動用のスクリプトを生成する。

$ touch ./run
$ chmod +x ./run
<?php
use Emerald\CLI;
CLI::getInstance()->execute($argv);

コマンドを動かす。
引数に何も与えないと、実行出来るコマンドリストが表示される。

$ ./run
-- EmeraldBeans CommandsList --
  Generate:                      引数に指定した名前で新しいコマンドを生成します
  GenerateModel:                 引数に指定した名前のモデルクラスを生成します
Foo コマンドを新たに生成する例
$ ./run Generate Foo
  success:  Foo command is created!

コマンドは、 library/App/Commands/Foo.php として生成される。
execute メソッドにコマンドの処理内容を記述する。
help メソッドはコマンドリストに表示するペルプメッセージを記述する。

コマンドが記述出来たら下記のように実行する。

$ ./run Foo

GarnetBeans

モデルクラスライブラリ。
Composer から app2641/garnet-beans でダウンロード出来る。
適当な場所にファイルを作り、LIB と APP という定数を指定する。
定数の意味は、EmeraldBeans のそれと同じ。
GarnetBeans では内部で SapphireBeans と EmeraldBeans を読み込んでいる。

まず、EmeraldBeans のコマンドで新規のモデルクラスを生成する。

$ ./run GenerateModel User
  success:  generated UserModel!

libraray/App 以下に Factory と Model ディレクトリが生成される。
Factory ディレクトリにはモデルを呼び出すためのファクトリクラスが置いてあるが、基本的に自動で更新されるため手を加える必要はない。
Model ディレクトリにはモデルクラス、クエリクラス、カラムクラスが自動生成される。
以下のように使う。

<?php
use Sapphire\Database\Helper;
use Garnet\Container,
    App\Factory\ModelFactory;

// データベース接続
Helper::connection('develop');

// コンテナにモデルファクトリを与える
$container  = new Container(new ModelFactory);

// モデルファクトリから UserModel クラスを呼び出す
$user_model = $container->get('UserModel');

// UserQuery クラスの fetchAllActiveUsers メソッドを呼び出す
$active_users = $user_model->Query->fetchAllActiveUsers();

// ActiveRecordの要領でレコードを更新する
foreach ($active_users as $user) {
    $user_model->setRecord($user);
    $user_model->set('is_active', false);
    $user_model->update();
}


モデルクラスの Query プロパティにはクエリクラスが格納され、
クエリクラスの Columns プロパティにはカラムクラスが格納されるようになっている。
クエリ類はクエリクラスに記述するのが責務が分割出来ていいと思う。

また、モデルクラスの insert, update, delete, fetchById メソッドは
内部的にはクエリクラスの同等の名前のメソッドを呼んでいるだけなので、

<?php
$user->is_active = false;
$user_model->Query->update($user);

と同義となる。

まとめ

まあ、おそらく俺以外使う人なぞいないと思うけど、こういう仕組み作っておくと適当な場面でうまい感じに使えると思う。
慣れれば簡単にデータベース周りやコマンド生成とか出来て便利に開発出来そう。