ちょっとした歴史
8月下旬から9月上旬にかけて、オブジェクト指向プログラミングのパラダイムを徐々に理解し、古いコードに恐怖を感じたため、Explay 2.1を悪夢として忘れ、すべてをゼロから書き始めることにしました。 はい、これはおそらくExplayのユーザーへの最善のステップではありませんでしたが、私の愚かな性質を言い訳するでしょう。
Explay 3の主なアイデアは、サイト開発者にデータタイプを完全に制御することです。この特定のプロジェクトに必要な10フィールドを記事に追加するか、Vkontakteのギフトなどの新しいデータタイプを導入します。 これらすべてにより、開発者は新しい型を導入して、PHPコードまたは独自のモジュールを書く時間を無駄にしないでください。 基本的に、この汎用性のために、システムにはカーネルしかなく、開発の数か月間は簡単ではありません。
今回は、index.phpではなく、空白の紙で思考
MySQL Workbench 5.0 OSSユーティリティは、データベースの設計に大いに役立ちました。
次のステップは、エンジンの「スター」オブジェクトのインターフェースを設計および作成することでした。 その瞬間から、コードに関する長くてゆったりとした作業が始まり、大学と作業によって減速しました。
12月以来、私はほとんど自由な人間になり、エンジンに密接に従事しました。開発はより速く進みました。 Explay CMS 3エンジンのコアを紹介しますが、効率は約70〜80%です。
誰かが私のエンジンの作成プロセスについて話そうとしているのを見たことがあるかもしれませんが、残念ながら、私は長い間再び十分ではありませんでした:
技術仕様
コード
コードは完全にOOPです。 OOPは、その後のすべての長所と短所で最大限に使用されます。 CMSの中核は24のクラスです:データベース内のレコードを表すコントローラーとオブジェクト-ORM (フィールド、タイプ、および単純なオブジェクト)。 例外なく、すべてのメソッドは、さらなるドキュメントのためにすでにコメントされています。
叙情的な余談:
エンジンの3つの基本的なエンティティは、タイプオブジェクト、フィールドオブジェクト、および通常のオブジェクトの3種類のオブジェクトです。
タイプは、通常のオブジェクトのカテゴリ(タイプ)です。 物理的な意味では、これは特定のタイプのオブジェクトが格納されるテーブルです。
フィールドは、オブジェクトのプロパティの説明です。 物理的な意味では、テーブルのフィールド(列)。 ただし、フィールドは、それが属するタイプのテーブルの列を常に記述することはできません。 フィールドは、関連(別のタイプの「JOIN」プロパティ)およびディレクトリ(値が別のテーブルに格納されているセレクター)にすることができます。
オブジェクトは、そのタイプのテーブル内のエントリです。
オブジェクトを取得するには、そのタイプとIDを知る必要があります。 オブジェクトのすべてのプロパティはフィールドによって記述されます。
MVC
幸いなことに、「Model-Presentation-Controller」パターンは、ファッションへのオマージュとしてではなく、必要性としてプロジェクトに含まれていることが判明しました。 そのおかげで、モデル/ビジネスロジック/モジュールにわずかなコードが費やされています。 その結果、コードの美しさと低開発コスト。
ModuleResponseは、呼び出されたモジュールメソッドの必須の「応答」オブジェクトです。 XMLテーブルの形式で表示されるデータ(オブジェクト)が含まれています。
図 1.ページのライフサイクル
パターン
XSLTは標準のテンプレートエンジンとして使用されます 。 言うべき特別なことは何もありません、美しい:)
PHPコードレベルでの実装:必要なテンプレートは、奇妙な形式でモジュール応答オブジェクト(ModuleResonse)に与えられます:拡張なしのxslファイルへの相対パス(テンプレートはtplであると想定されます)。 たとえば、my :: __ default():
$response->setTemplate ('my/__default');
example.com/module/methodなど、モジュールメソッドがアドレスバーから呼び出された場合、その回答で指定されたテンプレートが「エントリポイント」として使用されます。
ちなみに、インストールを必要としないマクロとモジュールのおかげで(すべてのタイプに関連付けられていることを除いて)、後者はテンプレートから接続されたプラグインとして機能できます。
開発者とレイアウト設計者の生活を簡素化するために、マクロが導入されました。 構文: {{module_name :: method_name(parameters)}} 。 指定されたモジュールの回答に従ってコンパイルされたテンプレートは、単にマクロの代わりに挿入されます。 これはテンプレートを構築するための最も美しいオプションではないかもしれませんが、ドキュメント()を介してXSLTにXMLテーブルを直接ロードするよりも明らかに高速です。
高負荷とキャッシング
CMSはソーシャルネットワークとオンラインコミュニティの作成に重点を置いているため、キャッシングがすべてです。 キャッシングのイデオロギーは、オブジェクト全体の保存です。 それらが変更されると、対応するキャッシュがリセットされます。
エンジンのアーキテクチャでは、データベースへの1つのクエリで複数のオブジェクトを選択することはできません。各オブジェクトに対して独自の要求があります。 ここに最も重要な問題と最もおいしいハイライトがあります。 たとえば、記事には100件のコメントがあります(100件のリクエスト+リストの選択にキャッシュされた1つのID)。 キャッシングがオフの場合、常に101件のリクエスト(書き込み)が発生し、オンの場合は少なくとも1になります。モデレーターによって1つのコメントを変更すると、少なくとも2、新しいオブジェクトを追加するときと同じです。 したがって、高速キャッシュエンジンを使用すると、かなり柔軟で比較的軽量なシステムが得られます。 ただし、キャッシュなしでCMSを使用するのは、ホーム開発専用です。
〜/ explay / classes / CacheController-フロントエンドキャッシュコントローラー。 含まれるファイルとMemcacheバックエンド。
通常のオブジェクトとシステムオブジェクトに対して異なるライフタイムが可能です(著者のメモ)。
システム要件
必須:
- PHP 5.x
- XSLT
- InnoDBサポート付きMySQL(5.1が望ましい)
- mb_string
- mod_rewrite
推奨:
- メクマセド
打ち上げ
SVNの現在のバージョンは、コード全体とアーキテクチャ自体に慣れている可能性が高くなります。
ルートフォルダーにはdump.sqlファイルがあります-これはデータベースにあります。 explay / config.phpの設定。 作業モジュールmy 。
基本的なCNCルール: example.com/module_name/ method_name / param0 / param1 /.../ paramN
example.com/something/uri/to/hell .xml-モジュール応答のXMLテーブルを提供します:)
example.com/something/uri/to/hell?debug-いくつかのデバッグ情報。
この記事の目的
この記事は、CMSの紹介にすぎません。 Habrahabrは、おそらく、独立した専門的なレビューを聞くことができる唯一の場所であり、本当に必要です。 また、将来彼女と一緒に働く人がいるかどうかも理解したいと思います。 批判、アドバイス、ビジネス提案を歓迎します。
SVNでコードを表示
ご清聴ありがとうございました!