10

ほとんど独学のプログラマーとして、デザインパターンなどに関してはゲームに遅れています。CodeIgniterを使用して労務管理Webアプリを作成しています。

私は学校でMVCASP.NET/C#とJavaを少しやりましたが、慣例では、モデルは主に実際のオブジェクトを表すクラスで構成されていましたが、すべてのデータベース接続なども抽象化されていました...これはかなり標準的なMVCのものです私が集めたものから。

CIはデータベース接続を完全に見えないところで抽象化すると言っているのは正しいと思います(見に行かない限り)。これは当然のことです。作成できるモデルは、「一般的な」CRUDメソッドをもう少し抽象化できます。特定のモデルにより役立つメソッドをいくつか作成します。

私が問題を抱えているのは、MVCで慣れているものとは異なるため、データベースから行を返すと言うときは常に、連想配列または標準オブジェクトに行を配置することです。行からのデータを表すプロパティを使用します。

ASPには、この情報を格納するために構築できる実際のクラスがあります。たとえば、Houseクラスがあり、データはプロパティ(たとえば、、)として保存されbedroomsbathroomsメソッドaddressはデータを使用して実行できる便利なこと(たとえば、printInfo()may print("$address has $bedrooms bedrooms and $bathrooms bathrooms!'))を表します。

インターネットで見たコードから、これは標準的な方法ではないという印象を受けています。配列またはジェネリックオブジェクトを使用することになっていますか?$this->house_model->print_info($houseobject)代わりに...実行し$houseobject->print_info();ますか?

ありがとう。

4

3 に答える 3

28

それとは反対の主張にもかかわらず、CodeigniterはMVCをまったく使用していません(実際、Webフレームワークはほとんど使用していません!)実際にはPAC(Presentation-abstraction-control)アーキテクチャを使用しています。基本的に、PACではプレゼンテーション層にプレゼンター(CodeIgniterがコントローラーと呼ぶ)からデータが供給され、MVCではビューがモデルから独自のデータを取得します。このMVCの誤ったラベル付けのために、混乱が生じています。

そのため、CodeIgniter(および他の人気のあるWebフレームワークのほとんど)は適切なモデルを推奨していませんが、その場所にアクセスするための非常に基本的なデータを使用しています。これは「ファットコントローラー」のために多くの問題を引き起こします。ドメインに関連するコードはどれも再利用可能になりません。

参考文献:

これは、PHPコミュニティで広く見られる混乱のポイントです(MVCとPACの記事では、問題はPHPコミュニティに起因するものとして特定されています。これは2006年に作成されたものであり、フレームワークとチュートリアルが増えたために悪化したとしても、何も変わっていません。 MVCの誤った定義を教えています。)そして、Web開発以外のバックグラウンドから来た「MVC」PHPコードを見ている人々が当然混乱する理由。PHPのほとんどの「MVC」実装はMVCではありません。モデルを適切に構造化する必要があると考えるのは正しいです。それ自体をMVCとしてラベル付けするのは間違っているCodeIgniterです。

于 2012-12-11T14:20:37.150 に答える
1

CodeIgniterは、MVCパターンに従うことに関しては非常に柔軟性があり、それをどの程度適用するかはあなた次第です。オンラインで見つけるCodeIgniterコードのほとんどは、あなたが説明したものとまったく同じです。モデルは実際には単なるメソッドのコレクションであり、オブジェクトを厳密に表現しようとはしていません。

ただし、CI内が好きな場合は、そのようにコーディングすることもできます(これは、私がよく行うことです)。これにより、コードの保守性と読み取り性が大幅に向上し、全体的に優れているように見えます。

PS-PHPでMVCを始めたばかりの場合は、少し見て回ることをお勧めします。CodeIgniterやCakePHPのようなフレームワークは、(ある程度)前世代のものです。CIは当初PHP4用に作成されていましたが、PHPではOOPサポートがややむらがありました。この問題に対処するために、 Fuelと呼ばれるCIのフォークが特別に作成されました(ある時点で、最初から書き直すことでより適切に機能することを決定したと思います)。CIは、Fuelよりも広く使用されているため、オンラインで多くのドキュメントとヘルプを利用できるという利点があります。

于 2012-12-11T03:13:54.430 に答える
1

コントローラ

 // get the houses result from the model 
 // return it as an object 
 if( ! $houses = $this->house_model->findHouses($search) )
 { // if no results - call a no results view 
 $this->load->view( 'no_results', $data );
 }
 else
 { 
 // pass the houses object to data so it automatically goes to view
 data['houses'] = $houses ; 

 // Call your view
 $this->load->view( 'house_results', $data );
 }

見る

// we already know we have at least one house,
// thats what the controller is for, so we dont need to do an isset() etc for $houses

foreach $houses as $house :

echo 'This fine house at ' . $house->address . 'has '. $house->bedrooms . ' bedrooms and ' $house->bathrooms . ' bathrooms' ; 

endforeach ;   

明らかに、ビューでその最後の文を作成するさまざまな方法がありますが、アイデアは、ビューに到達するまでに、可能な限り単純であるということです。

したがって、「良い学校の隣にあるすべての家を見せてください」のような複雑なクエリの場合は、寝室が2つあり、ペットのオセロット用の部屋があります。それがモデルで起こることです。厄介な条件とビジネスルールのすべて。ビューは具体的である必要があります-結果がない場合-結果なしのビューを表示するだけです。対-ビューで結果チェックを実行し、結果がないことに基づいて表示を変更します。ビューを具体的にするほど、構築が容易になり、コントローラーとモデルで選択を行うことができます。

于 2012-12-11T05:53:03.503 に答える