1つのクラスからのPHPのエンティティ「フレームワーク」

テクノロジーの開発により、すべてのプログラマーが自分のコンピューターを所有するようになったため、副作用として、数千のさまざまなライブラリー、フレームワーク、サービス、APIなどがあります。 すべての機会に。 しかし、この人生のケースが来ると、問題が発生します-それらを何に使用し、それが完全に適合しない場合に何をするか-書き直し、ゼロから書き、または異なるユースケースにいくつかのソリューションをねじ込みます。



多くの人が、プロジェクトを作成することは、プログラミングではなく、いくつかの既成のソリューションの統合コードを書くことよりも、多くの場合、ダウンすることに気づいたと思います。 そのような組み合わせは、その後のタスクで繰り返し使用できる新しいソリューションになる場合があります。



特定の「実行中の」タスク、つまりPHPでデータベースを操作するためのオブジェクトレイヤーに移りましょう。 PDOからマルチレベル(そして、私の意見では、PHPではまったく適切ではない)ORMエンジンに至るまで、多くのソリューションがあります。



これらのソリューションのほとんどは、他のプラットフォームからPHPに移行しました。 しかし、多くの場合、著者はPHPの機能を考慮に入れていません。PHPの機能は、移植性のある構成の記述と使用の両方を劇的に単純化します。

このクラスのタスクの一般的なアーキテクチャの1つは、アクティブレコードパターンです。 特に、いわゆるEntity(エンティティ)は、このテンプレートに従って構築され、EJB3の永続Beanから.NETのEFまで、多くのプラットフォームで何らかの形で使用されます。



それでは、PHP用に同様の構成を構築しましょう。 完成したADODBライブラリと、PHPオブジェクトの弱いタイピングと動的なプロパティの2つのクールなものを一緒に接続しましょう。

ADODBの多くの機能の1つは、データとの連想配列に基づいてレコードを挿入(INSERT)および更新(UPDATE)するための、いわゆるSQLクエリの自動生成です。

実際には、キーをフィールドの名前、値をデータとして、配列を取得し、SQLクエリ文字列を生成する軍事的なものはありません。 しかし、ADODBはより知的にそれを行います。 クエリは、以前にデータベーススキーマから読み取られたテーブルの構造に基づいています。 その結果、第一に、既存のフィールドのみがsqlに入り、すべてではなく、第二に、フィールドタイプが考慮されます-文字列に引用符が追加され、送信された値の文字列の代わりにADODBが見た場合、タイムスタンプに基づいて日付形式を形成できます。



それでは、PHPの側面から見ていきましょう。

このようなクラスを想像してください(簡略化)。



class Entity{
   protected $fields = array();
   public final function __set($name, $value) {
        $this->fields[$name] = $value;
   }
   public final function __get($name) {
        return $this->fields[$name];
   }

}

      
      







ADODB SQL , , XML . . , , , .



, .

Gist. , . , — , .



, :



CREATE TABLE   `users` (
  `username` varchar(255) ,
  `created` date  ,
  `user_id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`user_id`)
)

      
      





— ADODB .



, Entity



/**
 * @table=users
 * @keyfield=user_id
 */
class User extends Entity{

}

      
      







.

:




$user = new User();
$user->username=' ';
$user->created=time();
$user->save(); //   

//   
$thesameuser = User::load($user->user_id);
echo $thesameuser ->username;


      
      







.

( , view=usersview) , , . . getMetatada() .



Entity ?



, init(), Entity, .

afterLoad(), , timestamp .

.



/**
 * @table=users
 * @view=usersview
 * @keyfield=user_id
 */
class User extends Entity{
    protected function init() {
        $this->created = time();
    }
    protected function afterLoad() {
        $this->created = strtotime($this->created);
    }
}

      
      







beforeSave beforeDelete , , — , .



( WHERE ).

$users = User::load("username like '' ");

      
      





Entity , «» SQL . , . , ( user_id, ), . , , , , . . EF -.



, AR. — . , Entity Manager .



— , , .



— PHP , ( Entity) -. , - .



? , , — , , , . , , ( 99.9%) . , , - .



P.S. GitHub



All Articles