DB抽象化

私がPHPで書き始めたばかりだったとき、OOPはおそらくシンタックスレベルで所有していたでしょう。 当時、mysql_ *関数で十分でした。 時間が経つにつれて、より多くの経験があり、最適化について考え始めました。 このトピックでは、私のコードの進化について説明します。



最初のステップは、データベースでの作業を容易にする単純なクラスを作成することでした。 コードはそれほど少なくなく、典型的なクエリは基本的に単純化されました。 また、入力パラメーターは自動的に選別されました。 おまけとして、MySQL以外のデータベースのコードを使用できるようになりました(同じインターフェースを持つクラスを作成することにより)。 少なくともほとんどのリクエストを書き換える必要はありません。 コードは次のようになりました。

$ db = 新しい MysqlDb($サーバー、$ユーザー、$パス、$ db、$プレフィックス);

$ db-> select ($ key、$ value ); //おそらく、異なる数のパラメーターを使用する多くのクエリオプションがありました。

while ($ db-> fetch()){

$ row = $ db-> getRow();

...

}

または$ rows = $ db-> getResult();

*このソースコードは、 ソースコードハイライターで強調表示されました。


データベースでの作業を簡素化するために、Active Recordの使用を開始しました。 私の決定は他の人にほとんど失われましたが、それで十分でした。 当時、Zend Frameworkが登場したため、そこからいくつかのアイデアが取り入れられました。 クラス自体はPDOを介して動作しました(ただし、php_mysqlを介して動作するためのライブラリも利用できました)。

コード例:

$ db = Cms_Db :: factory( 'MySQL' );

$ db-> connect($サーバー、$ユーザー、$パス、$ db、$プレフィックス);

$ element = $ db-> select'id' 、$ id);

$ element-> name = '新しい名前' ;

$ element-> update(); *このソースコードは、 ソースコードハイライターで強調表示されました。


このオプションはかなり前から存在していました。 しかし、時間が経つにつれて、彼は逃し始めました。 このクラスは広く開発され、標準クエリを処理するための新しいメソッドが追加されました。 それまでに、Zend Frameworkの安定リリースがリリースされました。 常に新しいタイプのクエリを追加するのは面倒です。



時間が経つにつれて、私はサイトの主要なオブジェクトのモデルを書き始めました。 内部では、私の古いクラスはまだ機能していましたが、外部では、すべての操作はかなり透過的に見えました。 このアプローチが気に入ったため、実装を簡素化するために、ORMを使用することにしました。 最初は、DoctrineとPropelを詳しく調べましたが、最終的に実装を書くことにしました。



データベースの操作はZend_Dbを介して実行されます。柔軟性のために、Zend_Db_Selectも使用されます。 モデルの説明はDoctrineによく似ています。 しかし、私のモデルには、いくつかのデータの表現を記述するためのデータも含まれています。 例を挙げます。

Model_News クラスは Cms_Essence_Modelを拡張します

{

パブリック関数setDefinition()

{

$ this-> addField( 'name''Title'

-> addField( 'link''Address''link'

-> addField( 'date''Post date''date'

-> addField( 'description''Short description''text、255' 、配列(

'validate' => 'isVoid'

'detail' => true

)))

-> addField( 'content''Content''editor' 、配列(

'detail' => true

'minLength' => 40、

'validate' =>配列( 'isVoid''minLength' ))

)))

-> setOption( 'editorTableClass''newsTable' );

}

}

$ element = Cms_Essence :: get'Model_News' )-> getById(2); *このソースコードは、 ソースコードハイライターで強調表示されました。


本格的なORMと同様に、テーブルの関係を記述して、次のようなコードを使用することもできます。

$ user = Cms_Essence :: get'Model_User' )-> getJoined( 'Model_Group''name' 、 'megahertz');

$ groupName = $ user-> group-> name; *このソースコードは、 ソースコードハイライターで強調表示されました。


もちろん、そのようなリクエストの便宜のために、私はまだ本格的なORMとは程遠いですが、これまでのところこのオプションは私に合っています。



このアプローチにより、最小限のコードを記述できます。 説明したモデルがあれば、コードを1行も書かずに管理パネルで使用できます。 さらに、管理パネルは、サイト上のクラシック、Ajaxエディター、別のサイト上のRPCなど、任意のタイプにすることができます。 コードを記述しないように、テンプレートでコンポーネントを使用することもできます。 たとえば、Smartyでは、コンポーネントは次のようになります。

{状態モデル= Model_News名=ニュース制限= 3}

< ul >

{= $ニュースからのリスト}

< p >

< b > {$ newsList- > name} {$ newsList- > date} </ b > <br />

{$ newsList- >説明} <br />

<a href = "{$ newsList-> getUrl()} " >詳細</ a >

</ p >

{/リスト}

*このソースコードは、 ソースコードハイライターで強調表示されました。


このモデルのもう1つの大きな利点は、サンプルの結果を自動的にキャッシュできることです。 選択はすべてキャッシュされ、モデルデータを変更する操作中にキャッシュは自動的にクリアされます。



将来、このアプローチを維持する可能性を排除するのではなく、Doctrineに基づいています。 しかし、そのような必要はありませんが。 これは、抽象化の最後のバージョンとはほど遠いと思います。






All Articles