“Teeple2” カテゴリのアーカイブ


概要

EC-CUBEはここ数年勢いを増していてかなり認知度があがってきています。2.11.4も登場してスマートフォン向けのデザインが強化されるなど、機能も充実の一途です。そんななかプログラマーを悩ませるのは、「コードが酷い」ということ。。もう少しきれいなコードだったらカスタマイズしやすいのになあ。。何度そういうため息を漏らしたことでしょう。
こういった状況を少しでも改善していきたいと、まずはDB操作のコードを楽にするためのプラグインを開発しました。
「開発した」といっても弊社で公開している Teeple2 というフレームワークのORマッパーである TeepleActiveRecord をEC-CUBE用に移植しただけなのでたいした工数はかからずにできました。
使い方はほぼ http://code.google.com/p/teeple2/wiki/DatabaseIntro こちらに書いてあるやり方と同じです。(こちらではPDOは使っていません。)
下のコードは同梱したテストケースからの抜粋ですがこんな感じでなにをやっているか一目瞭然のコードがかけます。


        $productList = Entity_DtbProductCategories::get()
            ->join('dtb_category')
            ->join('dtb_products')
            ->contains('dtb_category.category_name', 'なべ')
            ->contains('dtb_products.name', 'なべ')
            ->order('dtb_products.product_id')
            ->limit(10)
            ->offset(0)
            ->select();

        $this->assertEquals('おなべレシピ', $result[0]->dtb_products->name);

ダウンロード

こちら から。(無料でご自由にお使いいただけます。)

セットアップ方法

配布しているアーカイブは以下のようにEC-CUBEのディレクトリ構成と同じ形になっていますので、そのまま配置してください。
(実行に必要なのは data/plugin/activecube 以下のみです。)

data
  |- plugin
    |- activecube

test
  |- class
    |- activecube

次に data/require_classes.php の末尾に

require_once DATA_REALDIR . 'plugin/activecube/config.php';

と記述を追加してください。これだけで使えるようになります。

しくみ、注意点など

  • lowlevelでは EC-CUBEの SC_Query クラスを使用しています。トランザクションの制御などはこちらを使用して行なってください。本ライブラリはあくまでSC_Queryのラップであり、SQLを組み立てやすくしたり、結果セットの扱いをオブジェクト階層構造で扱えるようにしたりしています。
  • MySQL, 2.11版のみ用意しています。(私がMySQLしか使わないため。。) Postgresへの対応は少しの修正でできるのではないかと思います。
  • Entityクラスにjoinの設定があります。間違っていたり足りなかったりした場合はここを修正するとよいです。
  • Entityクラスに自由にドメインロジックを追加することができます。そのような使い方をすると便利かと思います。
  • ログはEC-CUBEのsite.logに出力されるようになっています。ログレベルを変更したい場合はActiveRecord.php の 48行目あたりを修正してください。
  • 本ライブラリはフリーで提供していますので、不具合等によるいかなる損害についても弊社では責任を負いません。自己責任でご利用をお願いします。

Comments EC-CUBEのDBを「流れるインターフェース」でらくらく操作できる「ActiveCube」を開発しました はコメントを受け付けていません


概要

「楽観的排他制御」という言葉を初めて目にしたのはJavaフレームワークSeasar2のS2Daoにおいてでした。
それまでの開発ではSELECT FOR UPDATEを多用していた気がしますが、以来ほぼすべてのプロジェクトで「楽観的排他制御」のパターンを用いることにしました。統一的でシンプルな仕様だからです。

ここで言う楽観的排他制御とは

以下のようなしくみを言います。

  • 全てのテーブルには version列(int)またはtimestamp列(timestamp)を用意する。(version列のほうがよいと思います。)
  • レコードの更新をするときに version列もwhere句に含め、set句にはversion列をインクリメントする。(timestampの場合はtimestampをセット。)
  • update件数が0件だったら例外を投げる。
  • 上記動作をDBアクセスライブラリ(ORマッパー)が透過的に取り仕切る。(開発者は意識しない。)

Teeple2で実現するには

Teeple2 でこれを実現する方法を解説します。
Teeple2のDBアクセスライブラリ Teeple_ActiveRecordでは、insertおよびupdateの実行前に teeple_activerecord_before_insert, teeple_activerecord_before_update という関数の存在を調べ、存在した場合はこれらを実行した後に insert(update)を実行するようになっています。
このhook関数にはエンティティオブジェクト自身が引数として渡ってくるので、ここでversion列をインクリメントしたり条件を追加することによって楽観的排他制御が実現できるわけです。

例えば以下のようなコードをuser.inc.phpに追加します。


function teeple_activerecord_before_update($obj) {
    if (property_exists(get_class($obj), 'version') === TRUE) {
    	// 楽観的排他制御
    	$obj->setConstraint('version', $obj->version);
    	$obj->version += 1;
    }
    return;
}

リンク

Comments Teeple2で楽観的排他制御を実現するには はコメントを受け付けていません


概要

Teeple2 にデータベースマイグレーション機能を追加しました。これによりコマンド一発でデータベースの変更を適用し、エンティティクラスもそれに合わせて更新できるようになりました。
マイグレーション機能はシステムリリース後もそうですが、開発中も複数人で開発している場合は特に有用です。

使い方

まずmigrationディレクトリにDataSource名でディレクトリを作成します。
その中にデータベースに適用したいDDL文を NNN-somename.sql という形式で配置します。
「NNN」は001のようにバージョンを数字で表します。
ハイフン、またはアンダースコア以降は適当なファイル名で構いませんが拡張子は.sqlにする必要があります。

次に以下のコマンドを実行して差分を適用します。

$ php cli.php Teeple_Migration
 (cli.phpはbinディレクトリにある)

エンティティも同時に上書きしたい場合は –entityをつけます。

$ php cli.php Teeple_Migration --entity

※ Entity_Base_* が更新されます。

リンク

Comments Teeple2にデータベースマイグレーション機能を追加 はコメントを受け付けていません