前回までに足りなかった部分を補足してみる。



「V」に任せる処理はすでにはっきりしているが、「M」に書くべきか「C」に書くべきかいまいち迷ってしまうことがある。


そこで方針をより明確にして「M」なのか「C」なのか迷わないような線引きを考える。



まず「M」にはビジネスロジックを書くという方針は決まっているので、「C」にはそれ以外を書くことになる。


「C」で受け取った値(リクエストパラメータやフォームデータ)は「C」内の関数reqdata()によって未定義なら空文字にする処理を施す。(これはビジネスロジックにかかわらず施す処理)


function reqdata($key)
{
    return isset($_REQUEST[$key]) ? $_REQUEST[$key] : '';
}



これ以上の処理(必須入力かどうかとか最大文字列長チェックなどの検証いわゆるバリデーション)になるとビジネスロジック側でやるべき範ちゅうに入ってくるので「M」に任せる。


ということで「M」内には必須入力などをチェックするis_data()関数を用意することでうまくいく。


function is_data($s)
{
    return strlen(trim($s));
}
function seterrmsg($s)
{
    $this->val['errmsg']= $s; return false;
}


if (!$this->is_data($s)){
    return $this->seterrmsg("必須入力されてません。");
}
if ($this->is_data($s) > MAX_LENGTH){
    return $this->seterrmsg("入力が多すぎます。");
}



「C」側から「M」にデータ要求してそれを表示させる場合にはhtmlspecialchars()関数など使ってエンティティ変換する必要があるのでこの処理は「C」で行う。(いわゆるサニタイズなどと言われるもの)


つまり「M」から返すデータはタグを含まないものかもしくはエンティティ変換済みでタグ付きのものにしなければ処理はうまくいかなくなる。


「M」から受け取った値のリストを「C」で表にしたい場合は、「C」内に表作成関数(エンティティ変換付き)を作るなどするのが素直な解り易い方法になる。