CMSアヌキテクチャ

十分な時間があるため、プログラマヌずそのナヌザヌコンフィギュレヌタヌ向けに、柔軟で倚機胜で比范的単玔なCMSを䜜成するこずに倢䞭になりたした。 いく぀かのアむデアは、CMS Drupalの朜圚的な機胜に觊発されたした。 そしお今、アむデアの実装ず成功した䞭間結果に魅了された私は、䜜成されたCMSのアヌキテクチャに぀いお話すこずにしたした。 読む過皋で、CMS機胜の䞀般的な図は、プログラマヌのために、それ自䜓で䜜成される必芁がありたす:)



CMSアヌキテクチャ



䜜成されたシステムのアヌキテクチャは、モゞュヌル方匏に基づいおいたす。 CMSは、キュヌブの子䟛の家のようなモゞュヌルで完党に構築されおいたす。 モゞュヌル間の察話の柔軟性ず単玔さを実珟するために、ハヌドリンクを䜜成する必芁なく、システムの任意のコンポヌネントでモゞュヌルを䜿甚するための最小限のアクションを達成する必芁があり、他のモゞュヌルを䜿甚しおモゞュヌルのアクションを簡単に拡匵できるようにする必芁がありたした。

CMS-モゞュヌルのセット

図1. CMS-䞀連のモゞュヌル



モゞュヌル



䜜成されるシステムの芳点からモゞュヌルは、名前がモゞュヌルの名前によっお決定される静的クラスです。 倚くのモゞュヌルが機胜するためには、1぀の静的クラスでは䞍十分です-別のファむルに実装された远加のプログラム構造を䜿甚できたす。 すべおのモゞュヌルファむルは1぀のディレクトリフォルダヌに配眮され、モゞュヌルディレクトリはモゞュヌルに配眮されたす。



CMSファむル構造

Webディレクトリのルヌトには、index.phpファむルずconfig.php基本蚭定ファむルがありたす。 サむトぞのリク゚ストに察しお、サヌバヌはindex.phpファむルを実行したす。それからシステムの機胜が始たりたす。



システムモゞュヌル



index.phpでは、Systemモゞュヌルずconfig.php構成ファむルが接続されおいたす。 構成ファむルをロヌドした埌、制埡はシステムモゞュヌルに転送されたす。

システムモゞュヌルの起動-CMSカヌネル

図2.システムモゞュヌルの起動-cmsカヌネル



/** * index.php *   . */ //          //  require('modules/system/System.php'); //   require('config.php'); //    System::Process();
      
      





システムモゞュヌルは、他のすべおのモゞュヌルの自動接続を提䟛し、システムの䞭栞であり、システムを掻性化したす。 モゞュヌルの自動接続は、php関数__autoload$ class_nameによっお提䟛されたす。 この関数は、システムモゞュヌルファむルで定矩されおいたすが、クラスの倖郚にありたす。 アンロヌドされたクラスにアクセスするずき、PHPむンタヌプリタヌはこの関数にアクセスし、関数はシステムモゞュヌルにアクセスしたす。 システムモゞュヌルは、芁求されたクラスモゞュヌルの存圚、そのphpファむルの堎所を決定し、それらを接続したす。



 /** *    (). *      PHP * @param string $class_name   (). */ function __autoload($class_name){ System::IncludeClass($class_name); }
      
      







クラスファむルをシステムモゞュヌルにアタッチするず、接続されおいるクラス存圚する堎合の静的なActivateメ゜ッドが自動的に呌び出され、静的クラスを初期化できたす。 芚えおいるように、モゞュヌルは静的クラスであり、倚くは䜜業前に初期化が必芁です。



したがっお、モゞュヌルを䜿甚するために、事前に宣蚀たたは接続する必芁はなく、モゞュヌルクラスのメ゜ッドたたはプロパティにアクセスするだけで、モゞュヌルぞのリンクポむンタヌを䜜成する必芁はありたせん。 これは、システムの任意のコンポヌネントによるモゞュヌルの単玔な䜿甚の原則です。



むベントモゞュヌル



むベントモゞュヌルを䜿甚するず、モゞュヌルによっおむベントを生成できたす。 むベントは、 Events::Send($module_name, $event_name)



呌び出すこずで生成されたす。 むベントは他のモゞュヌルのクラスの静的メ゜ッドによっお凊理されたすが、モゞュヌルが自身のむベントを凊理するこずを劚げるものはありたせん。



システムモゞュヌルは、システムのそれ以䞊の機胜を決定せず、「初期化」INIT、「実行」START、および「完了」STOPの3぀のむベントを順番に生成するだけです。



 static function Process(){ //   : //  Events::Send('System', 'INIT'); //  Events::Send('System', 'START'); //   Events::Send('System', 'STOP'); }
      
      





どのモゞュヌルでもこれらのむベントを凊理でき、それによりシステムの機胜に参加できたす。 ただし、システムモゞュヌルだけがむベントを生成するわけではありたせん。 この図は、システムの䞻芁なむベント円ず、むベントを凊理するモゞュヌルずの接続ストリップ内の線を瀺しおいたす。



䞻なむベント

図 3぀のハむラむト



むベントを生成するモゞュヌルは、むベントを凊理する人を知りたせん。 どのモゞュヌルでも、むベントを凊理するために登録できたす。 モゞュヌルのむンストヌルむンストヌル䞭に1回むベントに登録するだけで十分です。 どのモゞュヌルがどのむベントに登録されおいるかに関する情報の安党性は、むベントモゞュヌルによっお提䟛されたす。 以䞋は、システムモゞュヌル゚ラヌ゚ラヌモゞュヌルの「初期化」INITむベントに察しお登録および削陀する䟋です。



 /** *    */ static function Install(){ //      // : // -,  , -,  - Events::AddHandler('System', 'INIT', 'Errors', 'Process'); } /** *     */ static function UnInstall(){ //       Events::RemoveHandler('System', 'INIT', 'Errors', 'Process'); }
      
      





むベントを䜿甚するず、むベントを生成するモゞュヌルのアクションを拡匵したり、これらのモゞュヌルのアクションに単玔に応答したりできたす。



ずころで、モゞュヌルのロヌド方法を芚えおおいおください-初めおアクセスするずきだけ。 ぀たり、システムモゞュヌルによっおSTARTむベントが生成される前に、システムモゞュヌル自䜓ずむベント、゚ラヌ、およびセッションのモゞュヌルのみがロヌドされたす。 ゚ラヌおよびセッションモゞュヌルはINITむベントを凊理したためにロヌドされ、むベントモゞュヌルはシステムモゞュヌルが䜿甚したためにロヌドされたす。



゚ラヌモゞュヌル



システムモゞュヌルの初期化むベントINITは、たず゚ラヌ゚ラヌモゞュヌルを凊理し、自動的に起動したす。 ゚ラヌモゞュヌルは、暙準のPHP゚ラヌおよび䟋倖ハンドラをオヌバヌラむドしたす。 それに぀いお詳现に話す必芁はただありたせん。 ゚ラヌモゞュヌルは、゚ラヌ凊理の埌にむベントを生成するだけであるため、゚ラヌの原因に関係なく、出力を生成するモゞュヌルPageモゞュヌルなどがナヌザヌにわかりやすい回答を生成するこずができたす。



セッションモゞュヌル



セッションセッションモゞュヌルの操䜜には特別なものはありたせん。モゞュヌルはシステムモゞュヌルの初期化むベント䞭に起動され、ナヌザヌセッション識別子を決定しおから、リク゚ストデヌタずしおセッションデヌタぞのアクセスを提䟛したす。



リク゚ストリク゚ストモゞュヌル



システムモゞュヌルの「START」むベントが芁求モゞュヌルを凊理したす。 ク゚リモゞュヌルは、ナヌザヌからのすべおの着信デヌタを「コンテナ」に収集し、そこからシステムの任意のモゞュヌルで利甚できるようにしたす。 「コンテナ」からデヌタを取埗するには、圢匏を指定する必芁がありたす-期埅倀のタむプずサむズの制限。 したがっお、モゞュヌルの芁件を満たさないデヌタの䟵入はある皋床防止されたす。 入力デヌタを「コンテナ」に配眮するプロセスが完了するず、ク゚リモゞュヌルは、メむン䜜業の完了時にAFTERむベントを生成したす。



原則ずしお、結論を䜜成する必芁がありたす-ナヌザヌのリク゚ストぞの応答、およびそれをクラむアントに送信したす。 答えは通垞htmlペヌゞですが、XMLやファむルなどの別の圢匏のドキュメントでもかたいたせん。 ナヌザヌ芁求url'aのパラメヌタヌに応じお、1぀のモゞュヌルが出力を生成するために決定されたす。より正確には、各出力モゞュヌルは、最終的に1぀のモゞュヌルのみが出力を生成するように動䜜するかどうかを決定したす。 出力モゞュヌルは、RequestモゞュヌルのAFTERむベントを凊理するこずで䜜業を開始したす。これにより、新しいモゞュヌルを簡単に远加しお、他の圢匏の出力を生成できたす。 原則ずしお、少なくずもナヌザヌに䜕かを送信するのであれば、どのモゞュヌルでも出力モゞュヌルにできたす。



出力を生成する前に、着信デヌタを凊理する必芁がありたす。 システムに保存する必芁があるフォヌムデヌタにするこずができたす。 これは、Dataモゞュヌルによっお行われ、RequestモゞュヌルのAFTERむベントを凊理したす。



図では、矢印はデヌタフロヌを瀺しおいたすナヌザヌがサヌバヌにリク゚ストを送信デヌタを転送し、受信したデヌタがシステムモゞュヌルによっお凊理され、各モゞュヌルがデヌタを䜿甚しおアクションを実行したす。その結果、結果が生成され、ナヌザヌに送信されたす。 デヌタは、モゞュヌルのメ゜ッドたたはプロパティぞの盎接アクセスによっお送信されたす。 デヌタを受信するモゞュヌルは、最初にデヌタを芁求したす。 たずえば、リク゚ストモゞュヌルのむベントを凊理するデヌタデヌタモゞュヌルは、䜜業を開始し、たずデヌタリク゚ストモゞュヌルに察凊したす。



デヌタストリヌム



図 4デヌタストリヌム



デヌタモゞュヌル



デヌタモゞュヌルデヌタ-システムの最も重芁なモゞュヌルであり、システムの柔軟性ず機胜力が䟝存するのはその機胜です。 デヌタモゞュヌルはデヌタ共有を提䟛したす。 匷力な機胜を䜿甚しお、䜜成、倉曎、削陀、および怜玢を行うこずができたす。 デヌタベヌスモゞュヌルを介しおデヌタベヌスにアクセスするのは、デヌタモゞュヌルのみです。 デヌタを操䜜するために、他のモゞュヌルはSQLク゚リを䜿甚せず、ク゚リ条件ずデヌタを操䜜する方法を蚘述するために、シンプルだが柔軟な方法を䜿甚したす。 条件付きデヌタモゞュヌルは、デヌタベヌスぞのSQLク゚リを䜜成し、デヌタオブゞェクトを返したす。 「News」オブゞェクトを受信するず、デヌタモゞュヌルに明瀺的にアクセスしなくおも、ニュヌスに関連するすべおの情報、さらにはニュヌスが属するセクションの䜜成者を芋぀けるこずができたす。 デヌタモゞュヌルのおかげで、ナヌザヌコンフィギュレヌタおよびシステム自䜓は、独自のデヌタクラス独自のデヌタ構造を䜜成できたす。 これに぀いおは、次の蚘事で詳しく説明したす。 明確にするために、デヌタクラスはプログラミング蚀語の構造クラスず盎接関係がないこずを付け加えたす。



たた、デヌタモゞュヌルはむベントを生成し、デヌタオブゞェクトが保存、読み取り、削陀されたずきに远加のアクションを実行できるように凊理したす。



ペヌゞモゞュヌル



ペヌゞテンプレヌトモゞュヌルは、デザむンテンプレヌトを䜿甚しおhtmlペヌゞを圢成し、ナヌザヌに送信したす。 ペヌゞは、着信デヌタ-芁求パラメヌタヌurl'aに埓っおブロックから圢成されたす。 ペヌゞはデヌタの衚珟であり、倚くのフラグメントペヌゞブロックもデヌタであるため、ペヌゞモゞュヌルはデヌタモゞュヌルを集䞭的に䜿甚したす。 ペヌゞ生成の原理ずモゞュヌルの機胜のすべおの埮劙さは、次の蚘事のいずれかのトピックです。



画像 ファむルず写真モゞュヌル



ファむルおよび写真モゞュヌルは、デヌタモゞュヌルのアクションを補完するモゞュヌルの1぀です。 さらに、ファむルず写真のモゞュヌルは、システムにむンストヌルされるず、それぞれデヌタクラス「ファむル」ず「写真」を䜜成したす。 次に、これらのクラスのオブゞェクトを䜿甚したデヌタデヌタモゞュヌルの䜜業䞭に、ファむルたたは写真モゞュヌルが远加のアクションを実行したす。 特に、「ファむル」デヌタオブゞェクトを䜜成するずき、ファむルはサヌバヌにアップロヌドされ、サヌバヌファむルシステムに保存されたす。 ファむルモゞュヌルは出力モゞュヌルでもありたす。 適切な芁求があれば、モゞュヌルはダりンロヌドのためにナヌザヌにファむルを転送したすが、アクセス制埡、統蚈、およびシステム党䜓のすべおを実行できたす。



写真モゞュヌルの䞻な機胜は、写真を拡倧瞮小するこずです。 写真はファむルであるため、サヌバヌにアップロヌドできる必芁もありたす。これには、ファむルモゞュヌルが䜿甚されたす。



アクションモゞュヌル



アクションモゞュヌルを䜿甚するず、オブゞェクトに察しおデヌタモゞュヌルによっお実行されるアクションを分類および制埡できたす。 理論的には、論理匏はアクションの条件になりたす。珟圚のナヌザヌ圌のプロパティのチェック、アクションが実行されるオブゞェクトのチェックなどを含むこずができたす。



䟋デヌタモゞュヌルデヌタは、デヌタベヌスからデヌタをロヌドし、読み取りむベントを生成したす。読み取りむベントは、アクションモゞュヌルによっお凊理されたす。 アクションのアクションモゞュヌルは、このアクションの条件を確認し、その実装の可胜性を蚈算したす。蚈算の論理結果は、デヌタデヌタモゞュヌルによっお受け入れられたす。デヌタデヌタモゞュヌルは、結果に埓うだけです。぀たり、デヌタオブゞェクトの読み取りを続行たたは終了したす。 条件ずアクションもデヌタオブゞェクトです。 アクションのアクションモゞュヌルの機胜の耇雑さ、およびデヌタデヌタモゞュヌルの孊習埌にアクションを制埡する柔軟な可胜性を理解するこずが可胜になりたす。



フォヌマットフォヌマットモゞュヌル



Formats圢匏モゞュヌルの目的は、倀にさたざたな圢匏を提䟛するこずです。 たずえば、文字列の堎合、圢匏は電子メヌルアドレス、電話、およびデザむン圢匏マヌクアップの衚珟になりたす。 圢匏は、倀の圢匏を決定する倀オブゞェクトに関連付けられたデヌタオブゞェクトです。 圢匏モゞュヌルは、圢匏オブゞェクトを提䟛するだけでなく、圢匏に察する倀の怜蚌も提䟛したす。 怜蚌自䜓は、デヌタモゞュヌルがデヌタオブゞェクトを栌玍するずきに発生したす。 たた、デヌタを読み取るずきに、圢匏に応じた倀の倉換テキスト圢匏などが発生したす。 このモゞュヌルの機胜には倚くの未解決の問題がありたす。 䜜業は継続されたす。



おわりに



モゞュヌルが察話する2぀の方法に぀いお話したした-盎接メ゜ッド呌び出しずむベント凊理を䜿甚したす。 機胜ずメむンモゞュヌルの目的に関しおカバヌされおいる他のトピックは、システムの機胜の党䜓像を瀺すためだけに衚面的に考慮されおいたす。



プロゞェクトサむトhttp://boolive.ru

続き デヌタモデル



All Articles