MVC アーキテクチャにおける責任分担の原則
最近、Yii Framework の MVC フレームワークを使用したプロジェクトを担当したのですが、最初はその構造が非常に堅牢だと思いました。
しかし、ビジネス ロジックについての理解を深めていくにつれて、問題の深刻さに気づき始めました。
私は MVC のコントローラーを誤解しており、過去の経験に基づいて、すべてのビジネス ロジックはコントローラーのアクションに実装されることが当然だと思っていました。
その結果、各コントローラーには数千行のコードがあり、コードはますます肥大化しています。
ついに、私はコードを再構築することを決意しましたが、その原点は、オープン API インターフェイスの必要性でした。
現在のアーキテクチャではコードの再利用は基本的に不可能なので、多くの関数を何度も何度も書く必要があり、これはとても容認できません。
オブジェクト指向プログラミングは教科書に載っているだけの用語ではありません。
実践を始めて初めて、オブジェクト指向の意識とグローバルな視点を持つことがいかに珍しいかに気づきました。
MVC 設計原則
1. MVC
モデルとは- View-Controller (MVC) は、デザイン フレームワーク (デザイン パターン) です。
MVC の目標は、ビジネス ロジックをユーザー インターフェイスの考慮事項から分離することです。
これにより、開発者は他の部分に影響を与えることなく、各部分をより簡単に変更できます。
MVC では、モデルはデータとビジネス ルールを表し、ビューにはテキスト、フォームなどのユーザー インターフェイス要素が含まれ、コントローラーはモデルとビュー間の通信を管理します。
MVC はさまざまなプログラミング言語で実装されています。たとえば、J2EE アプリケーション開発では、
View は jsp によって実装されます。コントローラーはサーブレットで、現在は一般的に Struts によって実装されます。モデルは次のように実装されます。実装するエンティティ Bean。
2. 遭遇した問題
Yii Framework は、Ruby on Rails の ActiveRecord(AR) 概念を利用した人気のある PHP フレームワークです。
データベース内のすべてのテーブルは AR クラスを使用して、追加、削除、変更、クエリ操作を簡単に実行できます。
AR をモデルとして扱い、models というディレクトリの下に配置することをお勧めします。
そのため、テーブルに対応する AR を自動生成した後は、モデル層がすでに存在することを当然のことと考えていました。
実際、AR は単なる DAO (データ アクセス層) であり、モデル層ではありません。
私たちのビジネスのほとんどすべてがコントローラーに置かれています。ユーザーが送信したフォームに対してさまざまな論理的判断を行い、計算を実行し、AR をインスタンス化してデータを保存します...
コントローラーがあるためは複数のアクションとなり、それぞれのアクションにはこのような業務処理があります。
ついに、コントローラーのコードが 1000 行を超えていることがわかりました。
ある日突然、リーダーは、私たちのシステムがサードパーティのインターフェイスを呼び出して提供できるように、既存の古いシステム用の API をオープンする必要があると言いました。
サードパーティはパラメータを与えるだけでよく、システムは結果の値を与えるだけで、業務処理は意識しません。
悪い点は、コントローラーがすでにこれらのサービスを実装しているにもかかわらず、フォームの送信を受け入れることです。どうすれば SOAP XML ドキュメントも受け入れることができるのでしょうか?
コントローラーは、コンドームと同様、できるだけ薄くする必要があります。
その役割は、ユーザー入力を受け入れ、それを処理のためにすぐに他のクラスに転送することだけです。
このように、コントローラーは異なるインターフェースを提供することのみを担当するため、ビジネス ロジックを分離することができ、分離されたビジネスを簡単に再利用できます。
ビジネスのこの分離された部分は誰が処理するのでしょうか?答えは「モデル」です。
3. ビューの役割
ビュー部分は比較的明確であり、表示を担当します。
表示インターフェイスと関係のないものはすべてビューに表示されるべきではありません。
したがって、複雑な判断文や複雑な計算プロセスは、通常、View には表示されません。
単純なループ ステートメントと書式設定ステートメントを使用できます。たとえば、ブログのトップページにあるテキストリストは一種のループです。
PHP Web アプリケーションの場合、HTML は View のメイン コンテンツです。
View はモデルの write メソッドを決して呼び出さないでください。
つまり、View は Model からデータを読み取るだけで、Model を書き換えることはありません。
したがって、ビューとモデルは切り離せないものであると言えます。
さらに、$_GET と $_POST は View から直接アクセスされず、Controller によって View に渡される必要があります。
さらに、View には通常、データベースへのクエリなどのデータ処理の準備がありません。
これらは通常、コントローラーに配置され、変数の形式でビューに渡されます。
つまり、ビューで使用されるデータは変数です。
4. モデルの責任
モデルにとって最も重要なことは、情報の保存と出力です。
たとえば、Post クラスには、ブログ投稿のタイトルを保存するために使用される title 属性が必要であり、削除操作が必要です。これらはすべてモデルの内容です。
データ、動作、およびメソッドがモデルの主な内容です。
実際の作業では、MVC の中でコード量が最も多いのは Model です。
モデルは、アプリケーションのビジネス ロジックもここで表現する必要があるため、ロジックの最も複雑な部分です。
モデルとコントローラーの区別に注意してください。
Model はビジネス ロジックを処理し、Controller は単に Model と View の間の関係を調整します。
ビジネスに関連するものである限り、モデルに含める必要があります。
データ検証、パブリック定数、変数はすべてモデル層に配置する必要があります。
つまり、再利用できる属性やメソッドは、定義後にモデル層に配置する必要があります。 、どこでも使用されます。
モデルはリクエスト、セッション、その他の環境データにアクセスしてはなりません。これらはコントローラーによって挿入される必要があります。
優れたデザインは、太いモデルと細いコントローラーである必要があります。
5. コントローラーの責任
コントローラーの場合、主にユーザーのリクエストに応答し、どのビューを使用するか、どのデータを表示用に準備する必要があるかを決定します。
したがって、リクエストのアクセス コード ($_GET、$_POST など) をコントローラーに配置する必要があります。
コントローラーはユーザー要求データの取得に限定され、データに対する操作や前処理は実行しないでください。これはモデル内に配置する必要があります。
データ書き込み操作の場合、完了するには Model クラスのメソッドを呼び出す必要があります。
ユーザーのリクエストに応じて、ビューのレンダリングが呼び出されます。
さらに、通常、HTML コードやその他のプレゼンテーション層のものは存在せず、これがビューのコンテンツである必要があります。
6. 啓発
Yii Framework の公式ドキュメントには次の段落があります:
In a well-designed MVC application, controllers are often very thin, containing probably only a few dozen lines of code; while models are very fat, containing most of the code responsible for representing and manipulating the data.
つまり、リッチ モデルの方が優れています。
以上がMVC アーキテクチャにおける責任分担の原則の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

PHP開発における固体原理の適用には、次のものが含まれます。1。単一責任原則(SRP):各クラスは1つの機能のみを担当します。 2。オープンおよびクローズ原理(OCP):変更は、変更ではなく拡張によって達成されます。 3。Lischの代替原則(LSP):サブクラスは、プログラムの精度に影響を与えることなく、基本クラスを置き換えることができます。 4。インターフェイス分離原理(ISP):依存関係や未使用の方法を避けるために、細粒インターフェイスを使用します。 5。依存関係の反転原理(DIP):高レベルのモジュールと低レベルのモジュールは抽象化に依存し、依存関係噴射を通じて実装されます。

システムが再起動した後、UnixSocketの権限を自動的に設定する方法。システムが再起動するたびに、UnixSocketの許可を変更するために次のコマンドを実行する必要があります:sudo ...

記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。

記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。

phpstormでCLIモードをデバッグする方法は? PHPStormで開発するときは、PHPをコマンドラインインターフェイス(CLI)モードでデバッグする必要がある場合があります。
