2007年11月28日

CodeIgniter:MVCの分離が怪しくなってきた

前回、慣れないオブジェクト指向でポリモーフィズム(もどき?)をやって力尽きました。一応当初の目標だったswitch文の駆逐には成功したものの、どうもコードが全般的に怪しくなってきた?というか書いてるうちにこれはControllerなのかViewなのかという区別が曖昧になってきました。

そもそもMVCというパターン?の厳密な定義?がよくわからない。自分的には勝手に

Model:データベースをごにょごにょするコード
View:HTMLを書く、ロジックは書かないで変数をechoするだけ
Controller:Viewにセットする変数を処理するところ

のような結構漠然とした感じで分けていましたが、コードを書いていくうちに↑の曖昧な定義でさえどんどん破られていくという…。

まず放っとくとViewがロジックだらけになっていくわけです(^^;。例えばテーブル出力するのにHTMLテーブルクラスを使ったとして、パラメータをセットしなきゃならない。これはそもそもVなのかCなのか?おそらく↑のような定義だとCだと思うんですが、index()内に書いたら最後、手続き型と変わらないぐらいindex()が長くなってしまう。

メソッドにしてindex()から出しちゃってもなんかすっきりしない。そうすると結局「テーブルを出力してるんだからこれはViewの仕事だ!」とかいう適当な&その場限りの&自分に都合のいい…なんか悪魔の囁きみたいなのが聞こえてきて、おもむろにViewファイルの下の方に<?phpとか書き始めちゃってるわけです。

メインのViewファイル(のHTMLの外)
<?php
function setTableHeading($th, $sort)
{
$th_tag = '';

foreach ($th as $field => $column)
{
$th_tag .= "<th>";
$th_tag .= anchor('gappei/sort/'.$field, $column);
if ($field == $sort['field'])
{
$order_mark = $sort['order']=='asc' ? '▽' : '△';
$th_tag .= " <span id=\"order_mark\">".$order_mark."</span>";
}
$th_tag .= "</th>\n";
}

return $th_tag;
}
?>

これぐらいだとまだfunctionにもなってるし、なんだったらController内にこのまま移すこともそれほど難しくない。だけど例えば五十音パッドを出力してるようなコードは、もうほとんどHTMLというより単なる手続き型のPHPスクリプトなわけで…。

ちなみに長いのでいちいちコード掲載しませんがPHPのコード部分だけで64行ありました。ほとんどが五十音パッドテーブル出力のためのパラメータのセットなんですが、こういうのはControllerに持っていった方がいいのかどうか???

そんな感じなんで、Viewファイルもパーツごと?に分けてみたりしましたが、結局どのファイルにもロジック?っぽい部分が少なからずある状態です。

Viewはそんな状態ですが、そもそものControllerの方も放っとくとすぐすごいことになってくる…っつーか、たぶん頭がオブジェクト指向的になってない?のか、CodeIgniter的作法がよくわからないというか…。

例えば前回晒した…
//検索オブジェクト取得
if ($this->phpsession->get('searchObj') <> '')
{
$searchObj = unserialize($this->phpsession->get('searchObj'));
} else {
$data['criteria'] = array('pref' => '', 'nc' => '', 'oc' => '');
$this->load->view('no_session', $data);
return;
}

//検索語句取得〜Viewに設定
if (get_class($searchObj) == 'NormalSearch')
{
foreach ($searchObj->getCriteria() as $key => $val)
{
$data['criteria'][$key] = $val;
}
} else {
$data['criteria'] = array('pref' => '', 'nc' => '', 'oc' => '');
}

この検索語句をViewにセットしている部分なんかは、勢いで適当に書いちゃってたわけで、ぐっちゃぐっちゃです。

んでこれを綺麗にしたいと思って…
//検索オブジェクト取得
if ($this->phpsession->get('searchObj') <> '')
{
$searchObj = unserialize($this->phpsession->get('searchObj'));
} else {
$this->load->view('no_session', $data);
return FALSE;
}

//検索語句取得
foreach ($searchObj->getCriteria() as $key => $val)
{
$data['criteria'][$key] = $val;
}

こんな感じに書き直したりしてみるわけです。まずNormalSearchの検索語句がない場合に配列を初期化している部分がうざいのでカットして、検索オブジェクトがNormalSearchかどうか判断してる部分もダサイのでカットして…みたいな感じで一見すっきりしてきてるようにも見えますが、これのおかげ?でViewの方でいちいち…
isset($criteria['cap'])?$criteria['cap']:'';

みたいなことを書かなきゃならないわけです。

まあissetの引数が関数の戻り値を直接書けないので、こうすればViewで受取った変数を書けるだけこっちの方がマシな気もするので、このようにしていますが、↑のMVCの定義?に照らし合わせるとどうなの?といった疑問はなかなか払拭できません。

Modelに関してはVやCと比べるとそれほど悲惨なことにはなってないような気もしないでもありませんが、SQL直書きに近い状態とか、発行したSQL“文”を再取得して使いまわしてたりとか、なんかカオスです(--;。

動きゃぁぃぃ!みたいなことを口走りましたが、今は動くけど次は動かね〜だろ!な状態です。んで、そんな中いい加減画面が見辛くなってきたので、cssでも書いてちょっと整形しようなどという考えが浮かんできてしまうわけです。

Viewがちゃんと切り分け出来てれば、本当にcssだけで整形できちゃったりするんでしょうが、ここはこれこの通りなわけで、cssだけの話じゃ済まない。

そもそもcssのファイルはどこに置けばいいんだ?という超初歩的事項から始まり〜長い道のり。

検索結果のステータス表示しようにも欲しい変数がセットされてない。取ってこようとすると今度は検索オブジェクト毎に場合分けしなきゃなんない。それをそのままベタに実装するとまたもやswitch文の嵐になるので、自作のでっちあげクラスを変更しないとなんない。

ちょっとしたアイコンやロゴ?みたいな画像を表示しようとしても相対パスで普通に書いても読み込めない(TT。base_url()とか使って絶対パスに変換してもsystem/application/images/hoge.pngとか書かなきゃなんない(のか?)。

とにかくそういう作業をしている最中も常に↑のMVCの分離?ということが頭のどこかをグルグルしてました。まあグルグルしてるだけで実際は分離とかとは程遠い状態になっているわけですが…。

そんなわけで今回はCodeIgniterとは直接関係のない愚痴もどきでしたが、なんとか紆余曲折の末cssで整形したので結果画面だけ晒しておきます。

css.jpg

本当はcssファイルとかViewやControllerで手を入れた部分をメモっとこうかとも思ったのですが、CodeIgniterとはあまりにも関係ないため止めました。いずれ完成したらソースとかもメモとして晒す予定です。

次回は検索機能を強化してみたいとおもいます。
ラベル:codeigniter 愚痴
posted by ciallost at 03:22| Comment(3) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする