Omelet Reference(Draft) 2

ドメイン

ドメインは、リレーショナルモデルがらくる概念で、対象の文脈においてこれ以上分解できない値の集合に対して名前をつけたものです。

ドメインは、一例として、郵便番号、氏名、日時などが挙げられます。

今挙げた例を思い浮かべてみればわかるように、別の文脈ではさらに分解する場合もあるでしょう(日時 -> 日付 + 時刻)。

ドメイン型の定義

Omeletにおいては、その値が属する型であり、 \Omelet\Domain\CustomDomain の派生クラスを指します。

1
2
3
4
5
// 郵便番号の場合

class Zip extends \Omelet\Domain\CustomDomain {
  
}

\Omelet\Domain\CustomDomain クラスのコンストラクタは、protected として定義されています。 そのため、派生クラスのコンストラクタでは、明示的に親クラスのコンストラクタを読んであげる必要があります。

1
2
3
public function __construct($zip) {
  parent::__construct(\Doctrine\DBAL\Types\Type::STRING, $zip);
}

親クラスのコンストラクタの引数は、以下の通りです

  • $type
    • \Doctrine\DBAL\Types\Type で定義されている、利用可能な型定数のいずれかを指定。
  • $value
    • 派生先のコンストラクタに渡された値。

保持する値の取得は、 getValue() を使用します。

関数従属の付与

ドメインは本来、一つの値をパッケージングしたものとなりますが、 Omeletでは、例えば郵便番号に対して住所のような関数従属となる値を保持できるようにしています。

1
2
3
public function __construct($zip, $address = null) {
  parent::__construct(\Doctrine\DBAL\Types\Type::STRING, $zip, ['address' => $address]);
}

コンストラクタの第二引数以降に、保持させたい値を割り当てるようにします。

親クラスのコンストラクタの第3引数に、これらの値を連想配列として渡します。

付与した値の取り出しは、 getOptValue(連想配列のキー名) を使用します。しかしこの関数はあえて protected として定義しています。 派生クラスで public として再定義するよりはむしろ、値ごとの取得関数を定義することを期待しているためです。

関数名は、後述の結果セットの変換の都合上、引数名() または、 get引数名() としてください。

1
2
3
function getAddress() {
  return $this->getOptValue('address');
}

結果セットからの変換

Omeletは、SQLの問い合わせにより得られた結果セットから、ドメインを作成させることができます。

通常、結果セットは連想配列として得られますが、ドメインのコンストラクラの引数名を連想配列のキーとして、値を取り出し、ドメインインスタンスの生成を自動的に行います。

別名の指定

コンストラクタの引数名と、結果セットのキー(カラム名)は必ずしも一致するとは限りません。

SQLの記述で合わせてしまうのもいいですが、Omeletでは、ドメインのクラス定義として別名を与えることができます。

ドメイン自身が保持する値については、コンストラクタにアノテーションコメント、 @Column (\Omelet\Annotation\Column) を付与します。

1
2
3
4
5
6
7
8
use Omelet\Annotation\Column;

class ....

/**
 * @Column(alias="zip_number")
 */
public function __construct($zip, $address = null) {

Column の alias プロパティに別名を指定します。

関数従属の値については、前の節で説明した取得関数に、 @Column アノテーションを付与します。

1
2
3
4
/**
 * @Column(alias="adrs")
 */
function getAddress() {

また、コンストラクタの引数名や別名は、設定の returnCaseSensor の影響を受けます。

引数や別名はキャメルケースであるが、設定を大文字のスネークケースにした場合、名称の変換が行われます。

結果セット値の型変換

結果セットはすべて文字列として返されます。別の型で保持したい場合型変換が必要となります。例えば日時を DateTime で保持するなど。

この型は、コンストラクタのタイプヒントの他に、コンストラクタのドキュメントコメントからの取得を試みます。

/**
 * @Column(alias="zip_number")
 *
 * @param string zip
 * @param string address
 * @param integer streetNumber 
 */
public function __construct($zip, $address = null, $streetNumber = null) {