1.4.3 アプリケーション(フロントコントローラ)(1)

1.4.3 アプリケーション(フロントコントローラ)(1)

1.4.3 アプリケーション(フロントコントローラ)(1)

セクション 1.4.2 では、元の MVC モデルが改善され、エントリ ファイルに URL 解析が実装されました。ユーザーからのすべてのリクエストは、サーバーの *** アクセス可能なファイルに送信されます。 URL を解析した後、最終的にアクセスするコントローラーにリダイレクトします。しかし、URL パラメータや POST データに必要なチェックや特殊文字のフィルタリング、ログ、アクセス統計など、システムが複雑化、多様化するにつれて、集中的に処理できるタスクをすべてエントリ ファイルで実行すると、コードの重複、混乱、ビジネス ロジックの分散が発生します。したがって、システムコードロジックの複雑さを軽減し、制御システムをさらに集中化し、システムのセキュリティ制御機能、保守性、再利用性、スケーラビリティを向上させるために、このセクションでは、元のMVCモデルを改良し、アプリケーション(フロントエンドコントローラー)の概念を提案し、複雑なシステムでMVCフロントエンドコントローラー開発モデルの最適化戦略を実装します。

1. アプリケーションにURL解析を実装する

さまざまなリクエストを処理するための中心を提供するために、フロントエンド コントローラー モードが採用されています。処理作業には、セキュリティ トランザクション、ビューの選択、例外処理、応答コンテンツの生成が含まれます。これらの処理タスクを 1 点に集中させることで、PHP コードの量が大幅に削減され、ビュー層のプログラム ロジックも削減され、異なるリクエスト間で大量のロジック コードを再利用できるようになります。

アプリケーション (フロント コントローラー) の URL 解析機能は、framework/Cweb-Application.php ファイルに実装されています。フローチャートを図1-9に示します。 URL解析コードは次のとおりです。

  1. php  
  2. クラスCWebApplication {
  3. パブリック $name;
  4. //デフォルトのコントローラはSiteControllerです
  5. パブリック $ defaultController = "サイト" ;
  6. //デフォルトのアクションはactionIndexです
  7. パブリック $ defaultAction = "index" ;
  8. //アプリケーションを実行する
  9. パブリック関数 run()
  10. {
  11. // URL が http://hostname/index.php の場合? r =コントローラーID / アクションID
  12. //コントローラID/アクションIDを取得
  13. if(!empty($_GET['r']))
  14. {
  15. $ルート= $_GET['r'];
  16. //コントローラIDを取得し、メンバー変数に割り当てる
  17. $ pos = strpos ($route,'/');
  18. $this- > defaultController = substr ($route,0,$pos);
  19. $this- > defaultController = strtolower ($this- > defaultController);
  20. //アクションIDを取得し、メンバー変数に割り当てる
  21. $this- > defaultAction =(文字列)substr($route,$pos+1);
  22. }
  23. //コントローラクラス名を取得する
  24. $ className = ucfirst ($this- > defaultController).'Controller';
  25. //コントローラのファイルパスを取得する
  26. $ classFile = "./protected/controllers/" .$className.'.php';
  27. //最後のステップ: クラスファイルが存在し、クラスが存在する場合は、インポートして acion メソッドを呼び出します
  28. if(is_file($classFile))
  29. {
  30. if(!class_exists($className,false))
  31. {
  32. $classFile が必要です。
  33. $クラス=新しい$className();
  34. $ functionName = "action" .ucfirst($this- > defaultAction);
  35. $class -> $functionName();
  36. }
  37. }
  38. }
  39. }

2. シングルトンモードでのアプリケーションの作成(フロントエンドコントローラ設計パターン)

システム内の一部のクラスでは、インスタンスを 1 つだけ持つことが重要です。たとえば、システム内に複数の印刷タスクが存在する可能性がありますが、実行できるのは 1 つのタスクだけです。システムにはウィンドウ マネージャーまたはファイル システムを 1 つだけ設定できます。システムにはタイミング ツールまたは ID (シリアル番号) ジェネレーターを 1 つだけ設定できます。たとえば、Windows ではタスク マネージャーを 1 つしか開くことができません。ウィンドウ オブジェクトを最適化するメカニズムが使用されていない場合は、複数のウィンドウがポップアップ表示されます。これらのウィンドウに表示される内容がまったく同じである場合、それらは重複オブジェクトであり、メモリ リソースを浪費します。これらのウィンドウに表示される内容に矛盾がある場合、それはシステムが特定の瞬間に複数の状態を持っていることを意味し、これは実際の状況と一致しておらず、どれが実際の状態であるかわからないため、ユーザーに誤解を招くことになります。したがって、システム内のオブジェクトの一意性を確保することが非常に重要です (つまり、クラスは 1 つのインスタンスしか持つことができません)。

システム内のアプリケーション (フロントエンド コントローラー) にはインスタンス オブジェクトが 1 つだけ存在し、インスタンス オブジェクトが外部から簡単にアクセスできるようにすることで、アプリケーション インスタンス オブジェクトの数の制御を容易にし、システム リソースを節約できることを期待しています。シングルトンパターンは最適なソリューションの 1 つです。

シングルトン パターンは、よく使用されるソフトウェア設計パターンです。重要なポイントは 3 つあります。まず、クラスにはインスタンスが 1 つしか存在できません。 2 番目に、このインスタンスを独自に作成する必要があります。 3 番目に、このインスタンスをシステム全体に自ら提供する必要があります。

具体的な実装の観点からは、3 つのポイントがあります。まず、シングルトン パターンのクラスはプライベート コンストラクターのみを提供します。 2 番目に、クラス定義にはクラスの静的プライベート オブジェクトが含まれています。 3 番目に、クラスは独自の静的プライベート オブジェクトを作成または取得するための静的パブリック メソッドを提供します。次のコードをframework/CWebApplication.phpに追加します。

  1. php  
  2. クラスCWebApplication {
  3. //クラスの静的プライベートオブジェクトを定義する
  4. プライベート静的$_app;
  5. //インスタンスオブジェクトが作成されるときにコンストラクタが自動的に実行されます
  6. プライベート関数 __construct($ config = null )
  7. {
  8. //設定ファイル内の配列を取得する
  9. }
  10. //静的パブリックメソッドは、独自の静的プライベートオブジェクトを作成するために使用されます
  11. パブリック静的関数 createApplication($ config = null )
  12. {
  13. if(self::$ _app === null)
  14. self::$ _app =新しいCApplication($config);
  15. self::$_app を返します。
  16. }
  17. //静的パブリックメソッドは、独自の静的プライベートオブジェクトを取得するために使用されます
  18. パブリック静的関数 app()
  19. {
  20. self::$_app を返します。
  21. }
  22. //アプリケーションを実行する
  23. パブリック関数run(){……}
  24. }

3. アプリケーション構成ファイル

デフォルトでは、アプリケーションは CWebApplication のインスタンスです。カスタマイズするには、通常、アプリケーション インスタンスを作成するときに、プロパティ値を初期化するための構成ファイルを提供する必要があります。これはコンピューターを組み立てるようなものです。お客様から具体的な構成シートをご持参いただき、ご要望に応じて要件を満たすコンピュータを組み立てます。 CWebApplication はアセンブラであり、構成シートは以下に説明する構成ファイルです。

構成情報は、配列要素として構成ファイルに保存されます。 1 つの要素は 2 つの文字列で構成されるキーと値のペアであり、1 つの文字列はキーであり、もう 1 つの文字列はキーに対応する値です。ほとんどのシステムには、構成ファイルに配置されたいくつかの構成定数があります。システムは、構成ファイルにアクセスして構成定数を取得します。プログラムを変更せずに、設定ファイルを変更することでシステム構成を変更できます。システムは、構成ファイルにいくつかの作業環境情報を保存することもできます。これにより、システムにアクセスするたびに、この情報が各アプリケーションのライフサイクルで実行されます。

これらの設定は通常、別の PHP スクリプト (protected/config/main.php) に保存されます。スクリプトでは、次の方法でこの構成配列を返します。

  1. php  
  2. 配列を返す(
  3. //デフォルトのコントローラ
  4. "defaultController" = > "デフォルト",
  5. //アプリケーションのグローバル アクセス メソッド Yii::app()- > name;を通じて直接アクセスします。
  6. "name"= > "私のアプリケーション",
  7. );
  8. ?>  

アプリケーションの構築メソッドに構成ファイル操作のコードを追加します。

  1. php  
  2. クラスCWebApplication {
  3. //インスタンスオブジェクトが作成されるときにコンストラクタが自動的に実行されます
  4. プライベート関数 __construct($ config = null )
  5. {
  6. //設定ファイル内の配列を取得する
  7. if(is_string($config))
  8. $ config = が必要です($config);
  9. /*
  10. 構成ファイルの配列で定義された要素をCWebApplicationクラスの同じメンバープロパティに割り当てます。
  11. 配列(
  12. "name"= > "私のアプリケーション",
  13. "defaultController" = > "デフォルト",
  14. );
  15. */
  16. if(is_array($config))
  17. {
  18. /*
  19. 最初のループ: $this- > name = "my application";
  20. 2 番目のループ: $this- > defaultController = "default";
  21. */
  22. foreach($config を $キー= > $ 値として)
  23. $this- > $キー=$ 値;
  24. }
  25. }
  26. }

気に入った友達はWeChatアカウントを追加できます:

51CTO 読書チャンネル QR コード


51CTO 読書チャンネル アクティビティ ディスカッション グループ: 365934973

<<:  1.4.2 エントリーファイル(2)

>>:  2.1.2 利点

推薦する

百度の青大根アルゴリズムは、1人を逃がすよりも、ミスで1,000人を殺したがる

Baidu が最近行った検索アルゴリズム(青大根アルゴリズム)のアップグレードに関して、このアルゴリ...

広告やソフト記事を通じてWeChatモーメンツでブランドプロモーションを完了するにはどうすればよいですか?

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています一部のニッ...

ウェブマスター個人が知っておくべき基礎知識

ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービスWebホスティングとは何...

クラウドとエッジ AI: あなたの施設に最適なのはどちらでしょうか?

ビル管理者は、これまでにない速さで、管理する建物にスマートテクノロジーを導入しています。 Junip...

国家インターネット情報局は31の違法ウェブサイトを閉鎖した。これらのウェブサイトはインターネットニュースサービスの資格を取得していない。

原題: 国家インターネット情報局が31の違法ウェブサイトを閉鎖北京ニュース(記者 江延馨)工業情報化...

WeChatモーメンツ戦略調整の重要な目的を解釈する

WeChatは開発されてから3年以上が経ち、テキスト、画像、音声、動画からモーメンツ、個人アカウント...

元Qidian創業チームの新しいウェブサイトがオープン。テンセントは100億を投じてShanda Literatureに挑戦

テンセントのオンライン文学への進出は、奇点中国語ネットワークの創設者である羅立氏の人生における突然の...

データベース管理システム: 未来は本当にクラウドにあるのでしょうか?

ガートナーが、クラウドがデータベース管理システム (DBMS) の事実上のソリューションになると宣言...

VMware が浙江瑞安農村商業銀行を支援

VMware は、VMware Cloud Foundation (VCF) フルスタック クラウド...

ヘンゴーストはどうですか?米国データセンターの独立サーバーの簡易評価、実際のテストデータの共有

Henghost の米国データセンターは、Henghost の 2 番目の主要なコンピューター ルー...

無視されているウェブコンテンツの書き方

「絵で読む時代」と言われる現在、動画、音声、画像などインターネット上のさまざまな表現が勢いを増してい...

9枚の写真でBATのクラウド戦略を分析し、この巨人が「クラウド戦場」をどうリードしているかを見る

クラウドこそが未来だと言う人もいます。クラウドを持たないインターネット企業はすぐに遅れをとるでしょう...

クラウドの後、州は富を築きました!年間1000万節約!

著者 |趙雲「クラウドコンピューティングからの脱却」。 DHHは昨年10月下旬にこの計画を提案して以...

クラウドネイティブデータベースがデジタルイノベーションの力を発揮

人類が誕生して以来、データの記録と処理能力の探求は止まることはありませんでした。たとえば、古代におけ...