Zend_Dbコンポーネントは、データベース処理を担当するクラスになります。
データベース処理は、『接続』して『データの出し入れ』を行う処理になります。
『接続』するためにはアダプタクラスのオブジェクトを作成します。
アダプタオブジェクトが作成できれば、基本的なデータベース処理(データ検索・更新)はこれ一つでできるようになります。
『データの出し入れ』は、テーブルクラスを作成して行います。
テーブルクラスはZend_Db_Table_Abstractクラスを継承して作成します。
あとは足りないテーブル固有の情報(テーブル名・主キーなど)を設定していくだけです。
クラス継承した時点で既にデータの出し入れを行うメソッドも継承されていてそのまま使うことができます。
もしテーブル独自の処理が必要なら自作のメソッドを追加していくこともできます。
ここまでで少し矛盾なのは、『接続』を行うアダプタオブジェクトにデータベースの検索・更新機能があって、データ出し入れ用に作成した『テーブルクラス』にもデータを扱えるメソッドが始めから用意されているということです。
が、ご安心ください。まずアダプタオブジェクトを作成(接続)したら、テーブルクラスでこれを使ってデータベースとやり取りできるように登録します。
そしてテーブルクラスのオブジェクトを作成した後、データの出し入れを行うメソッドを使うわけですが、この継承したメソッド(findやinsertなど)の内部では最終的にアダプタオブジェクトの備えるデータベース処理用のメソッドに渡して処理させるからくりになっています。
つまり実質データベース処理してるのはアダプタクラスということになります。
アダプタクラスこそがデータベース処理の総元締めだと言えるでしょう。
▽ いつ接続する?
アクセスがある度に毎回接続するのはその後の処理を考えると便利ではありますが、アプリケーションの観点から考えると、データベースを利用するアクション(処理)もあれば利用しないアクションもあるので、リクエストを受けた段階で一様に接続させるよりも実際の処理振り分け後(アクション)に必要な時にだけ接続させた方が効率が良さそうに思えます。
ただ、アダプタオブジェクトを作成したら明示的にgetConnection()メソッドを呼ばないと、最初にクエリを実行する時に自動的にデータベースへの接続が行われる仕組みになっています。
このことを利用して、最初に一様にアダプタオブジェクトを作成しておいてもクエリ実行さえしなければデータベースを利用しないアクションでもそれほど負荷はかからないように思えます。
ここでの結論として、最初に共通でアダプタオブジェクトの作成・登録までを行い、明示的getConnection()メソッドでの接続は行わないことにします。
▽ 接続情報ファイル [application/configs/db_info.ini]
▽ データベース接続寸前までを記述したスクリプト [application/config.php]
どの階層のスクリプトから呼ばれても正しい設定ファイルパスになるようにdirname(__FILE__)という定番の書き方をします。
ここまでで止めておけば、あとは実際にクエリを実行した時に初めてデータベースへの接続がされることになります。
では作成したconfig.phpを呼び出してデータベースとのやり取りがうまくいくか試してみましょう。
▽ コントローラスクリプト [htdocs/index.php]
とりあえずコントローラスクリプトとして、試しに表示させてみました。
このコントローラスクリプトは、いずれMVCのフロントコントローラとなることを見越したスクリプトになります。
つまりフロントコントローラになると下記のような書き方をしてconfig.phpを呼び出すことになります。
▽ フロントコントローラ [htdocs/index.php]
フロントコントローラから呼び出す初期化・設定ファイルは極力1つで済ませたい。(願望)
フロントコントローラに記述するものとして考えられるのは「データベース接続」や「自作プラグイン」や「アクション側に渡す設定値」「独自のルーティング指定」などが考えられますが、プラグインクラスをわざわざ自作するほどのことはないと思うので設定関連は大して膨れ上がらないと予測できます。
つまりconfig.php一つで十分だろう。。
フロントコントローラであるindex.phpにはできる限りこの記述以外はごちゃごちゃ書かない方向でいきたいです。(切望)
ここまできたらいっそのこと接続情報ファイルを分けないで書いた方がよりシンプルかも知れません。
[application/config.php] その2
うう〜ん、どーでしょー
これまで書いてきたconfig.phpやdb_info.iniと似たような構成でZend_ApplicationやZend_Tool関連で使われるファイル
application/Bootstrap.php
application/configs/application.ini
があるのでそちらに合わせた方がいいのか迷うところですが、余計な設定や記述が増えそうなので避けました。
よりシンプルで頑丈なアプリケーションを考えれば当然のことですね。
アプリケーションで使うデータベースに存在するテーブルはすべてクラス化します。(1つのテーブルごとに1つのテーブルクラスを作成)
Zend_Db_Table_Abstractクラスを継承し、テーブル固有の情報を記述することでテーブルクラスを作成することができます。
作成したテーブルクラスは、オブジェクト作成(new演算子を使う)した時点で既にそのテーブルを操作する機能(メソッド)を持ち合わせています。
そのテーブルに独自の処理を追加したい場合は自作メソッドを追加することができます。
▼ データベース作成
先にデータベースが出来ていないとテーブルクラス作成に進めないので、適当に作ります。
テーブル作成
▼ テーブルクラス作成
まずは外部キーを持たないテーブルDouguからクラス化します。
[application/models/Dougu.php]