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 利点

推薦する

、公的アカウントの生死

公会計の存亡の危機とは具体的に何を意味するのでしょうか?はっきり言えば、4つの言葉:交通量の減少。上...

国内ドメイン名登録業者トップ3:中国は4.92%で3位

中国IDCレビューネットワークは12月18日に次のように報じた。ドメイン名統計機関WebHostin...

百度の全面改革は検索結果に大きな変化をもたらすだろう

最近、みんなが注目している百度Kステーション事件からしばらく経ちました。6月22日から、百度はいくつ...

fastervm-ロサンゼルス C3 データセンター KVM 仮想 VPS 簡易評価 [server2003 付き]

中国の VPS 販売業者である fastervm は、ロサンゼルスの C3 データセンター (zen...

ウェブサイトのトラフィックを増やすための 5 つのヒント

はじめに: ウェブサイトの顧客を増やしたい場合は、ウェブサイトをシンプルに保ち、価値あるコンテンツを...

中国の共同購入サイトの数は2,919に減少し、毎日5.9サイトが消滅している。

昨日、共同購入ナビゲーションサイト「Tuan800」が共同購入データを発表した。9月末現在、共同購入...

Ecshop トピック最適化のための 5 つのヒントを共有

今日は、ecshopの特設ページを最適化するためのヒントをいくつか紹介します。ホームページでは一般的...

SEOはコンテンツや外部リンクだけでなく、総合的な最適化に重点を置いています。

「コンテンツは王様、外部リンクは女王様」というのは、SEO 初心者なら誰もが知っていて、最もよく耳に...

王寛:キーワードの選択については柔軟に議論すべき

当社の最適化プロセスにおいて、最も重要なプロセスの 1 つはキーワードの選択です。キーワードの選択は...

gatenode-4$/Xen/512m メモリ/30g ハードディスク/2T トラフィック/フェニックス シティ/サイト全体で 50% 割引

gatenode は、電話番号とオフィスの住所が記載された非常にシンプルな Web サイトです。他に...

ウェブサイトのユーザーエクスペリエンスを向上させる方法についての簡単な説明

ウェブサイトを構築した後は、ユーザー エクスペリエンスを生み出すトラフィックが必要です。ウェブサイト...

共同購入業界は再編を加速させている。何百ものウェブサイトがサービス商品を放棄している。

中小規模の共同購入ウェブサイトは、サービスを放棄して物理的な共同購入に重点を置きたいと考えていますが...

H1 タグを非表示にすると SEO に影響がありますか?

HTML コードに詳しい人なら H1 タグはご存知だと思います。H1 タグを非表示にすることが Ba...

クレイジーな「タオバオセレブ」:彼らは美容の第一人者か、それともオンラインストアのプロモーターか?

数日前、Taobao ストアを運営している女性の友人が、Weibo で新しい服を宣伝するのを手伝って...