フレームワークリポジトリの新機能:ORM / ActiveRecord

画像

LiveStreetエンジンの開発、つまりフレームワークの部分に関する一連の記事を始めたいと思います。 LiveStreetはかなり広くアピールするblogosotsialnyのhabraklonを得たが、2年前からすでにはるかに何かに進化しました。 特にバージョン0.4のリリースでは、*、 継承および委任機能を備えた プラグイン作成する十分な機会があったとき。

これらのテクノロジーを使用して、LiveStreetに すでにかなりの数の大規模なソーシャルネットワークが 構築されています。



この点に関して、開発者はプロジェクトの機能、モジュール、ハックを開発する必要があります。 プラグインの導入により、このプロセスが時々簡素化されました。 この方向で作業を続けます。次に、LiveStreetで開発した(および開発を継続する) ActiveRecordパターンに基づいたORMアプローチの実装のアルファ版について説明します。







画像

ORMとは(一言で言えば)


アイデアはORM、マッピングデータベースクラス(モデル)として、テーブル、およびこのクラスのオブジェクト、それらのレコードを提示することです。 ORMのアプローチの主な目的:ルーチンroutine機能(自動CRUDを SQL-クエリを記述し、応答を生成する必要性を失い、データベース内のデータで動作するように)。



前と同じように


以前は、モデル( サンプル )を作成するとき、一連の統一されたアクションを実行し、大量のコードを作成またはコピーする必要がありました。 LS構造でのみ、3つの大きなファイルを作成する必要がありました。

/modules/sample/Sample.class.php -モジュールファイル: モデルを管理するための関数のセット:AddSample()、UpdateSample() 、GetSampleById()、GetSampleByBlablabla()など、ほとんどの部分でその各々は、同義語でありますマッパー(以下を参照)およびキャッシングを処理します。

/modules/sample/entity/Sample.entity.class.php-モデルの本質。getId()、getBlablabla()、setId()、setBlablabla()などのメソッドのリストがあります。

/modules/sample/mapper/Sample.mapper.class.php-モデルのsql-mapper。これには、モジュールファイルとほぼ同じ機能が含まれ、テーブルへのsqlクエリのみが含まれます。

そして、これらのメソッドはすべて、新しいモデルを作成するたびに手動で作成/書き換えする必要がありました。 さらに、データベース内のテーブルの名前など、追加の設定を規定する必要がありました。



今できること


ORM実装は何を提供しますか? 実際、均一なコードの約80%を除去する機能。

モジュール、エンティティ、およびORM関連クラスを継承マッパーは、自動的に標準的な方法のほとんどを持っている:*()を取得、(追加 )、保存()、GetBy *()、GetItemsBy *()、()を削除、など



より詳細で古典的な例を挙げます。 「フォトアルバム」モジュールを作成するとします。

1)まず、エンティティデータのデータベースタイプで«アルバム»のprefix_albumと«写真»prefix_photoのテーブルを作成します。

album_id | author_id | album_title
      
      



そして

 photo_id | album_id | photo_title | photo_img_src
      
      







2)私たちのギャラリーのファイル・モジュールを作成します。/classes/modules/gallery/Gallery.class.phpを:

 <?php class ModuleGallery extends ModuleORM { public function Init() { parent::Init(); } } ?>
      
      







3)エンティティファイル/classes/modules/gallery/entity/Album.entity.class.phpおよび/classes/modules/gallery/entity/Photo.entity.class.phpを作成します。

 <?php class ModuleGallery_EntityAlbum extends EntityORM {} ?>
      
      



そして

 <?php class ModuleGallery_EntityPhoto extends EntityORM {} ?>
      
      







4)そして...それがすべてです。 これで、シングルトンエンジンを介してエンティティを管理できます。

 //   : $oUserCurrent = Engine::GetInstance()->User_GetUserCurrent(); //  short-alias: $oUserCurrent = LS::CurUsr(); //   : $oAlbum = Engine::GetEntity('ModuleGallery_EntityAlbum'); //  short-alias: $oAlbum = LS::Ent('Gallery_Album'); //    $oAlbum->setAutorId($oUserCurrent->getId()); $oAlbum->setTitle('First Album'); //     `prefix_album` $oAlbum->Add(); //  $oAlbum->Save(); //    : $oAlbum = Engine::GetInstance()->Gallery_GetAlbumByTitle('First Album'); //  short-alias: $oAlbum = LS::E()->Gallery_GetAlbumByTitle('First Album'); //   (  "Items"): $aPhotos = LS::E()->Gallery_GetPhotoItemsByAlbumId($oAlbum->getId()); //    : $oPhoto = LS::E()->Gallery_GetPhotoByTitleAndAlbumId('',$oAlbum->getId()); //  : foreach($aPhotos as $oPhoto) { $oPhoto->setAlbumId(2); $oPhoto->Save(); } //  ....
      
      



- > User_GetUserCurrent(); // : $oUserCurrent = Engine::GetInstance()->User_GetUserCurrent(); // short-alias: $oUserCurrent = LS::CurUsr(); // : $oAlbum = Engine::GetEntity('ModuleGallery_EntityAlbum'); // short-alias: $oAlbum = LS::Ent('Gallery_Album'); // $oAlbum->setAutorId($oUserCurrent->getId()); $oAlbum->setTitle('First Album'); // `prefix_album` $oAlbum->Add(); // $oAlbum->Save(); // : $oAlbum = Engine::GetInstance()->Gallery_GetAlbumByTitle('First Album'); // short-alias: $oAlbum = LS::E()->Gallery_GetAlbumByTitle('First Album'); // ( "Items"): $aPhotos = LS::E()->Gallery_GetPhotoItemsByAlbumId($oAlbum->getId()); // : $oPhoto = LS::E()->Gallery_GetPhotoByTitleAndAlbumId('',$oAlbum->getId()); // : foreach($aPhotos as $oPhoto) { $oPhoto->setAlbumId(2); $oPhoto->Save(); } // ....



- > Gallery_GetAlbumByTitle( 'ファーストアルバム'); // : $oUserCurrent = Engine::GetInstance()->User_GetUserCurrent(); // short-alias: $oUserCurrent = LS::CurUsr(); // : $oAlbum = Engine::GetEntity('ModuleGallery_EntityAlbum'); // short-alias: $oAlbum = LS::Ent('Gallery_Album'); // $oAlbum->setAutorId($oUserCurrent->getId()); $oAlbum->setTitle('First Album'); // `prefix_album` $oAlbum->Add(); // $oAlbum->Save(); // : $oAlbum = Engine::GetInstance()->Gallery_GetAlbumByTitle('First Album'); // short-alias: $oAlbum = LS::E()->Gallery_GetAlbumByTitle('First Album'); // ( "Items"): $aPhotos = LS::E()->Gallery_GetPhotoItemsByAlbumId($oAlbum->getId()); // : $oPhoto = LS::E()->Gallery_GetPhotoByTitleAndAlbumId('',$oAlbum->getId()); // : foreach($aPhotos as $oPhoto) { $oPhoto->setAlbumId(2); $oPhoto->Save(); } // ....







見積もりによると、この小さなセットでさえ、古いモジュールの標準モジュール、エンティティ、マッパーで説明されているメソッド(読み取り-コード行)の30%から40%を実装するのに十分です。

私は思う...それは素晴らしいことだ! :)



他に何?...関係


Webアプリケーションの重要な要素は、モデルの接続(関係)です。 通常、これらの関係は、テーブルの主キーを使用してデータベースを通じて作成されます。

例に戻りましょう:ギャラリーの写真がアルバムに関連していることは明らかです。したがって、あなたがどうであるかはわかりませんが、代わりにクールだと思います

 //   (  "Items"): $aPhotos = LS::E()->Gallery_GetPhotoItemsByAlbumId($oAlbum->getId());
      
      





私たちは書くことができます...

 $aPhotos = $oAlbum->getPhotos();
      
      





はい、間違いなくもっとかっこいいです! 問題ありません:)エンティティをリンクするには、エンティティクラスの説明で$ aRelations配列を使用して関係を構成するだけです。

現在空のファイル/classes/modules/gallery/entity/Album.entity.class.phpに戻り 、次のコードを追加しましょう。

 <?php class ModuleGallery_EntityAlbum extends EntityORM { protected $aRelations = array( 'photos' => array(self::RELATION_TYPE_HAS_MANY,'ModuleGallery_EntityPhoto','album_id'), 'author' => array(self::RELATION_TYPE_BELONGS_TO,'ModuleUser_EntityUser','author_id'), //  : 'photos' => array('has_many','Gallery_Photo','album_id'), 'author' => array('belongs_to','User','author_id'), ); } ?>
      
      



にhas_many'は、 'Gallery_Photo'は、 'album_id')、 <?php class ModuleGallery_EntityAlbum extends EntityORM { protected $aRelations = array( 'photos' => array(self::RELATION_TYPE_HAS_MANY,'ModuleGallery_EntityPhoto','album_id'), 'author' => array(self::RELATION_TYPE_BELONGS_TO,'ModuleUser_EntityUser','author_id'), // : 'photos' => array('has_many','Gallery_Photo','album_id'), 'author' => array('belongs_to','User','author_id'), ); } ?>





また、ファイル/classes/modules/gallery/entity/Photo.entity.class.phpの場合、次のように記述します。

 <?php class ModuleGallery_EntityPhoto extends EntityORM { protected $aRelations = array( 'album' => array('belongs_to','Gallery_Album','album_id'), ); } ?>
      
      





そしてそれだけです。 エンティティを使用してさらに簡単に操作できるようになりました、 注意

 $aPhotos = $oAlbum->getPhotos(); $sUserLogin = $aPhotos[0]->getAlbum()->getAuthor()->getLogin();
      
      







$ aRelations配列構文を扱います。

そのキーは関連エンティティの名前であり、 get *を介して利用可能になります。 ほとんどの場合、値は次の要素で構成される配列でもあります。



次は何ですか?


次の記事では、関係のタイプの説明について詳しく説明しますが、初めてツリー構造を管理できるツリーのタイプについて個別に説明します。 GetBy *()の関連エンティティの自動読み込みの機能について GetByFilter()、GetCountItemsBy *()、GetByArray *()、Update()、Delete()、Reload()、reload *()などの追加メソッド。



なぜこれだけなのですか?


我々は、開発者を募集しています。 順調なスタートにもかかわらず、フレームワークのコミュニティは今や幼少期にあります。私たちは、善良な人々がいなければ、実際のチームがなければ、LiveStreetを国際レベルに引き上げることははるかに困難であることをよく認識しています。 はい、私たちはこのために努力しています:)

私たちのイノベーションが開発者(およびユーザーや新興企業、コピーライター、PRマネージャー、スペシャリスト、投資家などすべての開発者)が本当に素晴らしい、若く、有望なLiveStreetエンジンに興味を持つようになることを心から願っています。



そして最後に、「そしてRoR / ZF / Yii ActiveRecordが100%になっている」および「心配しないで、Doctrineを自分用に!」などのトピックでホリバーを開始しないように事前にお願いします。 のは楽観的とします。



ご清聴ありがとうございました。

よろしく

アレクサンダー・ジンチュク(Ajaxy)。



All Articles