5

一般的な答えを使用できる特定の質問があります...PHPで多層アプリケーションを構築する場合、すべてをビジネスロジック層で行う必要がありますか、それともどの層でも機能しますか...例、プレゼンテーション層に(データベースからの)ユーザー情報を表示するアプリケーションを構築しています。ビジネスレイヤーを使用してデータをプレゼンテーションレイヤーに渡すだけにするか、データベースからプレゼンテーションレイヤー内で直接情報を取得する必要があります。プレゼンテーション層はデータを表示するためにJUSTを使用する必要があり、アクセサ層はデータを取得するためにJUSTを使用し、すべての作業はビジネス層で実行する必要がありますか?

また、さまざまなレイヤーについて言えば、手続き的に行うか、OOPを使用するのが最善です(テンプレートを表示するためにインクルードを使用するか、テンプレートを含めるためにクラスを使用するか、データを手続き的に検証するか、クラスを使用するか、関数とクラスを使用して取得するなど)データベースからのデータなど)

ご覧のとおり、私は物事がどのように機能するか、そして物事を行うための最良の方法を理解しようとしています。そうは言っても、何かアドバイスや、このテーマに関する一般的なヒントがあれば...そのままにしておいてください。

ありがとう

4

7 に答える 7

3

WebアプリケーションとN層は興味深いものです。これは主に、JSONとAJAX、またはFlashとXMLRPCの普及によりN層の概念が拡大したためです。Webopediaのこのグラフは、これをうまく表現する青い線をずらして表示しています。要約すると、ビジネス、アクセサ、およびプレゼンテーションロジックは、サーバー上に存在するだけでなく、場合によってはブラウザ内に存在する可能性があります。ただし、N層の目的は分離可能性です。UIやデータベースを変更したり、他のUIを追加したりする必要がある場合でも、ビジネスロジックに影響を与えることはありません。そして、これがAPIを決定するものです。つまり、HTMLとCSSがFlexで破棄され、MySQLがOracleに変更される日を予測しています。

これは決定された要件であり、私が使用した一部のWebアプリケーションでは、N層のバリエーションが同時に使用されます。たとえば、LyrisHQ(電子メールASP)を取り上げます。彼らは顧客のWebアプリケーションを持っています。最近、彼らはFlashベースのアプリケーションをプッシュすることを凝視しています。これは明らかに大量のデータをブラウザに直接送信しており、FlashUIで複製されたビジネスロジックが少しある可能性があります。ただし、異なる(および重複する)要件にはどちらか一方が必要であるため、両方のアプリケーションを維持する必要があります。

最も一般的なPHPアプリケーションは、フォーマットされていないデータをブラウザに送信することを考慮していません。しかし、もしそうなら、これはあなたがあなたのAPIをどのように設計したいかを非常に迅速にあなたに知らせます。おそらく、PHPプレゼンテーションテンプレートが使用したのと同様の内部コントローラークラスに加えて、XMLRPC、REST、またはSOAPと通信できるコントローラーが必要になるでしょう。これは、単純なWebログインページの場合、LoginControllerクラスと通信するログインフォーム用のPHPテンプレートがあることを厳密に意味します。XMLインターフェースも同様に同じLoginControllerクラスを使用します。SQLをAjaxリクエストに書き込むのが面倒だと思うのと同じように、プレゼンテーションテンプレートにクエリを書き込むことは厳密に避けます。

多くの場合、データベースのバックエンドのブランドを切り替える必要がないため、ビジネスレイヤーは多かれ少なかれ厳密になる可能性があります。厳密なN層設計では、ビジネスオブジェクトがデータベースと通信する方法は、ビジネス層を書き直さずにMySQLからMSSQLに切り替えることができるかのようになります。これは、各テーブル(Table Gateway)、各行(アクティブレコード)、各結合、または各トランザクションのオブジェクトをモデル化することによって行われる場合があります。これは、PDOやPHP-ADOのようなものが役立つが、完全に分離するには不十分な場合です。HibernateのようなJavaのORM/Persistenceレイヤーは、多くの場合、オブジェクトクエリ言語(OQL)を提供することにより、この種の分離をより適切に示します。

私自身、現在、MySQLベースのPHPアプリケーションからMS-SQLアプリケーションへのバックエンド移行に取り組んでいます。アプリケーションはこれまで直接SQLクエリのみを使用していました。クラスで一連のクエリを取得する方法を選択し、それらを抽象化するか、サブクラス化するか、できればビジネスロジックを変更しないことを想像してみてください。少なくとも、すべてのSQL呼び出しを間接的に行う必要があります。(PHP ORMに投稿してください。)

そして最後に、OOPについての質問に対して、要件を満たすためにどのように使用する必要があるかを使用してください。私の個人的なテクニックは、PHPプレゼンテーションテンプレートのロジックから数分間始めてボールを転がすことです。すぐにそれをクラスとテンプレートにリファクタリングします。共通の考えがある場合は、ルーチンを共有クラスに分割し、DNRYの原則を維持するよう努めます。(ここでのSO投稿。OOPはN層設計の基本的な要件ではありません。DNRYはコードを保守可能に保つために非常に重要です。多くの場合、期限とスコープシフトによってAPIが破壊されます。必要なものが得られるまでリファクタリングしてください。 OOPがあなたをそこに導くのに役立つに違いない。

于 2009-11-08T07:25:23.900 に答える
2

私はかつて、大きなコントローラー(アクセサー層)よりも大きなモデル(ビジネス層)を優先すべきだということを読んだことがあります。

また:それは本当にプロジェクトに依存します。私の目には、すべてにOOPを使用することが常に意味があるとは限りません(おそらく、ここで全員が同意するわけではありません)。特にPHPのようなスクリプト言語では、関数としてバリデーターを実行する方が簡単な場合がよくあります...

于 2009-11-08T00:25:12.347 に答える
1

プレゼンテーション層にデータベース呼び出しを行わないことを強くお勧めします。これは、その目的を損なうことになります。

多層アーキテクチャにはさまざまなアプローチがあり、推奨事項も異なります。

私が使用したZendFrameworkは通常、Fatモデル/Thinコントローラーバリアントの形式です。

この記事を見つけた場合は、PHPフレームワークの選択に関する注意事項(この場合)をCakePHPとZendFrameworkの比較に非常に適しています。

私の意見の最大の違いは、CakePHPが採用している設定より規約のアプローチです。これは、ZendFrameworkの構成の焦点とは大きく異なります。

多層アーキテクチャを実装する場合に非常に理にかなっているフレームワークを使用することにより、ある意味でOOPの使用を強制されるか、少なくともプッシュされます。これは悪いことではありません。

もちろん、たとえば、純粋な機能呼び出しを使用して3層アーキテクチャを実装することもできますが、私の経験に基づくと、それほど拡張性はありません。

Webサイトの場合、層の通信方法が原因で実際​​にはまったく異なるMVCパターンが適切な選択です。

「通常の」3層アーチとMVCパターンの違いは、ビューがコントローラーとモデルレイヤーの両方にアクセスできるのに対し、プレゼンテーション層は3層アーチのロジックレイヤーにしかアクセスできないことです。

于 2009-11-08T01:28:37.163 に答える
0

私はフランツが言ったことに同意します。特に、大きなコントローラーよりも大きなモデルを優先することについてです。経験則を使用して、コードの行き先を区別することもできます。UI構造/フローに関係がある場合は、コントローラ; それが純粋なビジネスロジックである場合、それはモデルに入ります。

PHPウォーターをテストする前にStrutsで多くの経験を積んだJava開発者として、MVCのアイデアをスクリプト言語に適用する方法を理解するのに少し時間がかかりました。CodeIgnitorは大いに役立ちました。Strutsのようなフレームワークを提供し、優れたMVCパターンを促進します。

于 2009-11-08T00:45:27.827 に答える
0

私の世界は次のようになります。

DB1 <-アクセサ機能、データ整合性、このデータセットのビジネスルールを提供するModel1 DB2 <-アクセサ機能、データ整合性、このデータセットのビジネスルールを提供するModel2

コントローラ:ビューへのデータフローを制御し、ビューからのデータをフィルタリング/整理します。指定されたアプリケーションのビジネスルールを実装します。モデルのビジネスルールを知っています。

ビュー:コントローラーによって提供されたデータを表示するテンプレートにすぎません。すべてのデータをコントローラーに渡します。Model1またはModel2、あるいはそれらを管理するビジネスロジックに関する知識がありません。

于 2009-11-08T04:12:59.950 に答える
0

これはあなたのパズルの欠けている部分なので、デザインパターンについて調査することをお勧めします。このトピック(APressのものが良い)とデザインパターンの「バイブル」をカバーするPHP固有の本がたくさんあります:「デザインパターン:再利用可能なオブジェクト指向ソフトウェアの要素」

于 2009-11-08T07:45:41.067 に答える
0

Doctrine2のより安定したバージョンを待ちましょう。

これは、永続性を無視するドメインオブジェクト哲学で開発されています。このフレームワークを使用すると、多層アプリケーションの開発がはるかに簡単になります。

于 2009-12-15T11:34:07.393 に答える