ホームページ バックエンド開発 PHPチュートリアル MVC アーキテクチャにおける責任分担の原則

MVC アーキテクチャにおける責任分担の原則

Jan 10, 2019 am 10:02 AM

最近、Yii Framework の MVC フレームワークを使用したプロジェクトを担当したのですが、最初はその構造が非常に堅牢だと思いました。

しかし、ビジネス ロジックについての理解を深めていくにつれて、問題の深刻さに気づき始めました。

私は MVC のコントローラーを誤解しており、過去の経験に基づいて、すべてのビジネス ロジックはコントローラーのアクションに実装されることが当然だと思っていました。

その結果、各コントローラーには数千行のコードがあり、コードはますます肥大化しています。

ついに、私はコードを再構築することを決意しましたが、その原点は、オープン API インターフェイスの必要性でした。

現在のアーキテクチャではコードの再利用は基本的に不可能なので、多くの関数を何度も何度も書く必要があり、これはとても容認できません。

オブジェクト指向プログラミングは教科書に載っているだけの用語ではありません。

実践を始めて初めて、オブジェクト指向の意識とグローバルな視点を持つことがいかに珍しいかに気づきました。

MVC アーキテクチャにおける責任分担の原則

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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

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

確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 Apr 03, 2025 am 12:04 AM

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

システムの再起動後にUnixSocketの権限を自動的に設定する方法は? システムの再起動後にUnixSocketの権限を自動的に設定する方法は? Mar 31, 2025 pm 11:54 PM

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

PHPにおける後期静的結合の概念を説明します。 PHPにおける後期静的結合の概念を説明します。 Mar 21, 2025 pm 01:33 PM

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

PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? Apr 01, 2025 pm 03:12 PM

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

フレームワークセキュリティ機能:脆弱性から保護します。 フレームワークセキュリティ機能:脆弱性から保護します。 Mar 28, 2025 pm 05:11 PM

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

phpstormでCLIモードをデバッグする方法は? phpstormでCLIモードをデバッグする方法は? Apr 01, 2025 pm 02:57 PM

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

See all articles