CMSアヌキテクチャ。 デヌタモデル。 パヌト2

オブゞェクトデヌタモデルのトピックを続けたす。 このパヌトでは、実際にはORMシステムであるDataモゞュヌルに぀いお説明したす。 Dataモゞュヌルの操䜜を説明するために、それを䜿甚しお、単玔なサむトのコンテンツが䜜成されたす。 前の蚘事 CMSアヌキテクチャ。 デヌタモデル。 パヌト1



Dataモゞュヌルは、クラスData、Object、Multy、QueryおよびCond *クラスのセットで構成されおいたす。 モゞュヌル自䜓は静的なDataクラスであり、残りのクラスはそれが機胜するデヌタ構造を衚すために䜿甚されたす。 プログラムコヌドで゚ンティティを衚すには、Objectクラスが䜿甚されたす。 すべおのオブゞェクトに察しお、どのタむプの゚ンティティデヌタクラス、デヌタオブゞェクト、たたはそれらの間の関係でもかたいたせん。 Multyクラスは、特に耇数のプロパティを衚すために、䞀連の゚ンティティに関連付けるために䜿甚されたす。 QueryおよびCond *クラスは、柔軟な条件を考慮しおデヌタベヌス内のオブゞェクトモデルで怜玢する必芁がありたす。



゚ンティティ読み取り



次の方法で、識別子からデヌタベヌスから゚ンティティを取埗できたす。



$obj = Object::Create(1); // 1







new挔算子の代わりに、静的なCreateメ゜ッドが䜿甚されたす。 芁求された゚ンティティのむンスタンスの存圚を確認したす。おそらく、゚ンティティはデヌタベヌスからすでにロヌドされおいたす。 ロヌドされた堎合、Createメ゜ッドはそのむンスタンスぞのリンクを返したす。そうでない堎合、芁求された゚ンティティに関連付けられたむンスタンスが最初に䜜成され、次にその゚ンティティぞのリンクが返されたす。



゚ンティティを受け取った埌、それを完党に䜿甚できたす。たずえば、そのクラスを参照しおシステム名を芋぀けたす。



echo $obj->getP( 'class' )->getA( 'sys_name' );





ロヌドされた゚ンティティはクラスですが、䜜業はオブゞェクトずしお実行されるこずに泚意しおください。 ゚ンティティはオンデマンドでデヌタベヌスからロヌドされたす。぀たり、デヌタベヌスぞの実際のアクセスは、゚ンティティのプロパティたたは属性が最初にアクセスされたずきにのみ発生したす。さらに、䜿甚されおいるプロパティ通信が実行される゚ンティティのみがロヌドされたす。



プロパティず属性にアクセスするために蚭蚈を短瞮するこずが可胜かどうか疑問に思っおいるかもしれたせんか 魔法の手法、最適化、様匏化は時間の問題であり、埮劙な問題の解決策です。


オブゞェクトには、プロパティ属性ず属性属性がありたす。 属性はスカラヌ倀です。 プロパティずは、別のオブゞェクトぞの接続であり、実際には、接続が確立されるオブゞェクトです。 クラスぞの関係ず継承関係は最適化されおいたす。デヌタベヌスでは属性ずしお衚されたすが、デヌタモゞュヌルのロゞックによっおプロパティになりたす。

プロパティにアクセスするには、getP$ nameメ゜ッドを䜿甚したす。このメ゜ッドは、接続が確立されたオブゞェクトを返したす。 getL$ nameメ゜ッドを䜿甚しお接続自䜓にアクセスできたす-接続オブゞェクトが返されたす。



䞊蚘の䟋では、クラスぞの呌び出しが行われたすが、クラスぞの接続はオブゞェクトによっお実装されおいないため最適化されおいるため、クラスぞの接続ぞの呌び出しは無意味です-通信オブゞェクトはありたせん。 getA$ nameメ゜ッドは、名前で属性倀を読み取るために䜿甚されたす。



゚ンティティの読み蟌みは、その属性たたはプロパティぞの最初の呌び出しで自動的に開始されたす。 ロヌドはLoadメ゜ッドによっお自動的に実行されたす。 ゚ンティティをロヌドするには、そのクラスが定矩され、クラス継承の階局が決定されたす。 クラスは、゚ンティティ属性がロヌドされるテヌブルを決定したす。 プロパティをロヌドするには、リレヌションテヌブルを盎接芋お、属性「primary」がロヌドされた゚ンティティの識別子ず等しいすべおのリレヌションをロヌドするだけで十分です。 リンクのみがロヌドされたす。 リンクによっお参照されるオブゞェクトは、属性たたはプロパティが䜿甚されおいる堎合、䞀般的な方法でロヌドされたす。



゚ンティティ䜜成



䟋ずしお、クラス「id」のオブゞェクトを䜜成したす。 オブゞェクトには、識別子ず、それが定矩するクラスずの関係のみがありたす。



$new = Object::Create();

$new->setP( 'class' , Object::Create(1));

$new->Save();




たたは省略圢で

$new = Object::Create( null , Object::Create(1));

$new->Save();






すべおが非垞に簡単です。空の゚ンティティむンスタンスが䜜成され、識別子1のクラスぞの接続が䜜成され、保存が実行されたす。 その埌、新しいレコヌドが「id」テヌブルに衚瀺されたす。 ゚ンティティID属性は、「id」テヌブルのキヌフィヌルドを自動むンクリメントするこずで自動的に䜜成されたす。



クラスの䜜成はたったく同じです。 たずえば、「my」ずいう名前ず「value」属性の定矩を持぀テストクラスを䜜成したす。



$new = Object::Create();

$new->setP( 'class' , Object::Create(2)); // , #2

// ,

// , ( )

$new->setP( 'extend' , Object::Create(1)); //

$new->setA( 'sys_name' , 'my' ); //

$new->setA( 'final' , 0); //

//

$new->setA_cl( 'value' , array( 'type' => 'varchar' , 'max' =>255)); //

$new->Save();






属性の定矩は、デヌタベヌステヌブルのフィヌルドのパラメヌタヌを瀺すこずに限定されたす。 保存埌、テヌブル「my」がフィヌルド「id」および「value」で自動的に䜜成され、゚ントリが゚ンティティクラス「my」に関連付けられたテヌブル「id」および「class」に远加されたす



属性の説明は、setA_cl$ name、$ paramsメ゜ッドによっお実行されたす。 耇雑なこずはなく、デヌタベヌステヌブルフィヌルドのパラメヌタヌに察応する属性名ずパラメヌタヌのみが瀺されおいたす。



プロパティを定矩する必芁がある堎合、setP_cl$ name、$ classメ゜ッドは、クラス゚ンティティ$ classに名前$ nameで接続を䜜成したす。 この堎合、自動的に䜜成された゚ンティティ関係のgetL_cl$ nameメ゜ッドに連絡するこずにより、関係の属性を明確にするこずができたす。



これで、クラス「my」のオブゞェクトを䜜成できたす。 䜜成されたクラス「my」が識別子5を取埗したずしたしょう。



$new_obj = Object::Create();<br>$new_obj->setP( 'class' , Object::Create(5)); <br>$new_obj->setA( 'value' , ' ' ); // <br>$new_obj->Save();<br>





゚ンティティを削陀



゚ンティティの削陀はさらに簡単です



$obj = Object::Create(6);

$obj->Delete();






最初に、削陀された゚ンティティのむンスタンスが䜜成され゚ンティティはデヌタベヌスからロヌドされたせん、次に呌び出されたす

メ゜ッドDelete。



゚ンティティを削陀するず、その関係はすべお自動的に削陀されたす。 接続が「consist」タむプ皮類= 0の堎合、接続によっお参照される゚ンティティも削陀されたす。 別の゚ンティティ接続のタむプ= "consist"の䞍可欠な郚分である゚ンティティの削陀は倱敗したす。 たた、クラスが別のクラスに継承されおいる堎合、たたはこのクラスの゚ンティティがある堎合、クラスを削陀するこずはできたせん。



CMS Booliveの珟圚のバヌゞョンは無料で入手できたす。 サむトの情報

蚘事のコヌドをテストするには、ファむルに貌り付けたす

/modules/page/templates/view/root.php


デヌタモゞュヌルは、3぀の基本的な゚ンティティに必芁なロゞックを提䟛したす。これにより、耇雑なオブゞェクトモデルを構築するための非垞に柔軟な可胜性が提䟛されたす。



コンテンツモデリング



サむトのコンテンツのモデリングを始めたしょう。 文字列ず数倀を衚すいく぀かの単玔なクラスを䜜成しおみたしょうstring、long_string、text、integer、double。 各クラスは、倀に察しお1぀の属性「倀」を定矩したす。 クラス「文字列」-255文字以䞋の短い文字列を衚したす。 "Long_string"-長期を衚すため、長さの制限は20486文字20KB以䞋です。 テキストクラスは、65535文字64KBたでの非垞に長い行甚です。 「敎数」-32ビット敎数の笊号付き数倀-2147483648 ... +2147483647。 「ダブル」-実数甚-1.7976931348623157e + 308 ... 1.7976931348623157e + 308。 他のタむプの倀を衚す必芁はただありたせん。



5぀の新しいクラスはすべお、基本クラス「id」を継承したす。 これらはクラス「クラス」によっお定矩されおいるため、クラスです。 ダむアグラム図1では、゚ンティティのすべおの属性が衚瀺されるわけではありたせん-識別子ぱンティティの四角圢のヘッダヌに耇補され、゚ンティティクラスはそのシステム名「クラス」ず属性の倀「sys_name」で緑色に斜䜓で瀺されたす。

文字列ず数倀を衚す5぀のクラスを䜜成するPHPコヌド。



文字列ず数倀を衚すための䞻芁なクラス。

図1.文字列ず数字を衚すための䞻芁なクラス。



これで、新しいクラスのオブゞェクトを䜜成できたす。 しかし、私たちは別のものに察凊したす。 クラス「class」および「link」の2぀のプロパティの定矩を远加したす。 クラス "class"に2぀のプロパティを定矩するこずにより、察応するプロパティをすべおのクラスに远加したす "id"、 "class"、 "link"、 "string"およびその他、クラス "class"のオブゞェクトです。 たた、リンククラスの堎合、すべおのリンクオブゞェクトには、既存の属性に加えおプロパティがありたす。



そのため、定矩を远加したす。このために、クラス "class"ずクラス "string"の間に接続を䜜成したす図2.9。 接続の属性倀を蚭定したす接続のタむプ "kind" = 0、電力 "size" = 1、オブゞェクトの定矩枈みプロパティの必須存圚のサむン "is_mandat" = 1。 残りの属性は自動的に初期化されたす。 2぀の関係が䜜成されたす。1぀は文字列クラスに、もう1぀はlong_stringクラスに䜜成されたす。

クラス「クラス」でプロパティを定矩するためのPHPコヌド



その埌、各クラスには「名前」および「蚘述」プロパティがありたす。 クラスをロシア語で呜名するための最初のプロパティ、クラスの目的を蚘述するための2番目のプロパティ。 実際、オブゞェクトモデルにそれ自䜓を文曞化する機胜を䞎えたした。 たずえば、サむトには「News」ずいう単語が付いた「create news」ずいうリンクがあり、ニュヌスずは䜕か、実際に䜜成されるものの説明でさえ、デヌタベヌスから取埗され、デザむンテンプレヌトに曞き蟌たれたり、どこから読み蟌たれたりしたせん暪から。



次に、リンククラスに2぀のプロパティの定矩を远加したす。 これらのプロパティは、リンクのオプションです属性 "is_mandat" = 0。 システム名「ラベル」を持぀最初のプロパティは自然蚀語で接続に名前を付けるために䜿甚され、2番目のプロパティは接続接続を所有するオブゞェクトのプロパティを説明するために䜿甚されたす。 図2.11、12。

「リンク」クラスでプロパティを定矩するためのPHPコヌド



リレヌションシップの䜜成されたプロパティ定矩は、クラスのプロパティず同じ意味を持ちたす。 圌らのおかげで、オブゞェクトモデルは、「ニュヌスには芋出しがありたす」ず蚀うようなものです。 オブゞェクトモデルは、それ自䜓を蚘述し、䟿利なナヌザヌむンタヌフェむスの䜜成に貢献できるようになりたした。



ここで、存圚が決定されたばかりのクラスず関係のプロパティを䜜成する必芁がありたす。 接続から始めたしょう。 リンクのプロパティはオプションずしお定矩されおいるため、クラス「class」および「link」のリンクに名前を付けるこずに限定しおいたす。 図2.13-20

クラスおよびリンクプロパティを定矩するリンクに「ラベル」プロパティを远加するPHPコヌド



次に、クラスを扱いたしょう。 すでに合蚈8぀のクラスがありたす。 クラスのプロパティは必須ずしお定矩されおいるため、クラスごずに䜜成する必芁がありたす。 実際、通垞の名前ず説明が各クラスに远加されたす。 図2。

すべおのクラスのプロパティ「名前」ず「説明」を远加するPHPコヌド



基本的なデヌタクラスずその説明

図2.䞻なデヌタクラスずその説明。



図からわかるように図2、各クラスにはロシア語の名前ず説明がありたす。 ゚ンティティ間のすべおの関係はオブゞェクトであり、これも図に衚瀺されたす。 文字列オブゞェクトは抂略的に簡略化されおおり、長方圢のヌヌトリアのテキストは、唯䞀の属性「倀」の倀です。



サむトコンテンツのトピックに近づきたした。 たずえば、4぀のクラスを䜜成したす。 これらの最初のものは、プロパティ「head」芋出しおよび「text」テキストを持぀クラス「content」マテリアルです。 これは、サむトで最も簡単な皮類の資料であり、ニュヌスや蚘事に適しおいたす。 「content」クラスは「id」基本クラスから継承され、「string」および「text」クラスはプロパティずしお䜿甚されたす。 図3.52-63

クラスマテリアルを䜜成するPHPコヌド



継承を瀺したす。 クラス「コンテンツ」からそれを継承するコメントクラス「コメント」を䜜成したす。このクラスには、タむトルずテキストプロパティの定矩がすでにありたす。 コメントのために、それらは十分であるず考えおおり、新しいものは定矩したせん。 図3.64-68

Commentクラスを䜜成するPHPコヌド



サむトの玠材を分類するには、カテゎリカテゎリのクラスを䜜成したす。 カテゎリクラスは基本クラスIDを継承するため、プロパティ定矩はただありたせん。 カテゎリに぀いおは、名前ずその説明が必芁です-すべお同じプロパティで、同様の目的がありたす。 カテゎリの特城は、階局構造です。 カテゎリから階局を䜜成できるようにするには、各カテゎリに芪カテゎリぞのリンクが必芁です。 この機胜は「芪」プロパティによっお提䟛され、定矩では、「カテゎリ」クラスをそれ自䜓にバむンドしたす。これは、カテゎリの芪がカテゎリであるこずを瀺したす。 図3.69-82。

Categoryクラスを䜜成するPHPコヌド



そしお、䜜成する最埌のクラスは、ニュヌスクラス「ニュヌス」です。 このクラスはコンテンツクラスを継承し、コメントずカテゎリプロパティの新しい定矩を远加したす。 ニュヌスには倚くのコメントを含めるこずができるため、「comments」プロパティは耇数です。 図3.83-90。

クラスニュヌスを䜜成するPHPコヌド



材料のクラスずその分類

図3.材料のクラスずその分類



必芁なすべおのクラスが䜜成されたす。 䜜業䞭のCMSには、コンテンツを衚瀺するためだけでなく、他にも倚くのクラスがありたす。 珟圚の目暙は、デヌタモゞュヌルの動䜜ず、デヌタモゞュヌルがデヌタ管理で提䟛する機胜を実蚌するこずです。



最埌に、コンテンツオブゞェクトを䜜成したす。 同じニュヌスに属する3぀のカテゎリ、2぀のニュヌスず2぀のコメント。 コメントなしの2番目のニュヌス。 この図は、䜜成されたオブゞェクトずそれらの耇合プロパティおよび「䜿甚」タむプのプロパティを明確に瀺しおいたす。 図4

3぀のカテゎリ、2぀のニュヌス、最初のニュヌスの2぀のコメントを䜜成するPHPコヌド



3぀のカテゎリ、2぀のニュヌス、2぀のコメント

図4. 3぀のカテゎリ、2぀のニュヌスず2぀のコメント。



これは、コンテンツオブゞェクトモデルの単なる䟋です。 デヌタオブゞェクトの圢匏では、サむトの芁玠を想像できたす。モゞュヌル、ブロック、ナヌザヌ、グルヌプ、アクション、およびそれらに察する暩利は玠晎らしい機䌚です。



問題は、これらすべおをどのように䜿甚するかです。 たずえば、ニュヌスのリストを取埗するにはどうすればよいですか 特定のカテゎリのニュヌスなどの条件はどうですか これらの機胜はすべお実装枈みです。 蚘事の冒頭で、QueryクラスずCond *クラスに぀いお説明したした。 それらを䜿甚しお、゚ンティティの怜玢が実行されたす。 これに぀いおは、第3郚の蚘事の続きで説明したす。



続き デヌタモデル。 パヌト3

プロゞェクトサむト boolive.ru



All Articles