2012-03-04 9 views
3

私はコントローラが制御を行い、モデルがデータベースの処理を行うことを知っています。MVCプログラミングでは、モデルはどのくらいの距離を置く必要がありますか?

モデルの距離はどのくらいですか?

私が配列している場合:

array('first_name' => 'Thomas', 'second_name' => 'Clayson', 'email' => '[email protected]'); 

をそしてこれは、私はそれから抜け出すために必要なMySQLのクエリです:

INSERT INTO `users` (`name`, `email`) VALUES ("Thomas Clayson", "[email protected]"); 

私のモデルがどのように見えますか?

生データとフォーマットを取り、適切

public function insertUser($details){ 
    if(!isset($details['first_name']) || !isset($details['second_name']) || !isset($details['email'])){ 
     return false; 
    } 

    $full_name = $details['first_name']." ".$details['second_name']; 
    $email = $details['email']; 

    $query = "INSERT INTO `users` (`name`, `email`) VALUES ('".$full_name."', '".$email."')"; 
} 

コントローラまでフォーマットし、ちょうど入力を取り、DBに盲目的に他の

public function insertUser($full_name = false, $email = false){ 
    if(!$full_name || !$email){ 
     return false; 
    } 

    $query = "INSERT INTO `users` (`name`, `email`) VALUES ('".$full_name."', '".$email."')"; 
} 

何かをそれを置くを残しますか?

私の問題は、テーブルに入れるデータがたくさんあるため、各フィールドを関数の別の引数として持つことは本当にありません。しかし、私は、モデルに情報を並べると、各インデックスとフォーマットを適切にチェックする必要があるので、コントローラーでもそれほど重要なことはしません。仕事の2倍のようです。

しかし、もう一度、モデルでもそれをやっている気がしません!

他の人はどうしますか?

P.S.この問題は、コード・シグネチャ・フレームワークに基づいています(ただしこれに限定されません)。

+0

モデルオブジェクトを使用して、対応するデータベーステーブルの単一のレコードを表現してみませんか?それぞれのフィールドを表すクラス変数を持ち、好きなときにいつでも設定することができます。 insert()メソッドは、それらの変数にあるものを挿入します。 – imm

+0

うーん、音はそうです。私の質問は一般的なものでしたが、私はcodeigniterの使用に基づいていました。これは、その構造の機能性を持たないフレームワークです。あなたのソリューションは興味深いようですが、同時にcodeigniterがそれをサポートしていない場合、私はそれを行うより良い方法があると思いますか? –

+0

私はCodeIgniterがこれを行うことを許可していると思います。モデルのドキュメントには、データベース内のフィールドを表すクラスレベルの変数があります。http://codeigniter.com/user_guide/general/models.html – imm

答えて

1

ここで我々は再び行く... MVCで

モデルはないクラスです。ドメインビジネスオブジェクトは、データがから来ている、または任意の手掛かりを持っていないはず

  • ドメインビジネスロジック
  • データアクセスとストレージ

:それは責任の2種類のオブジェクトを含む層であり、それは記憶される。つまり、データベースもなく、すべての情報が一部のリモートREST APIに入る可能性が非常に高いため、ドメインオブジェクトにはSQLが存在しません。

データベースを使用している場合、SQLはDAOになります(通常はdatamapperを実装します)。

フォーメーションは、ドメインオブジェクト、データアクセスオブジェクト、コントローラのいずれにも責任を負いません。

フォーメーションは、MVCの本格的なオブジェクトであり、いくつかの貧血テンプレートではないビューで行われる必要があります。 Viewはプレゼンテーションロジックを担当します。ドメインモデルレイヤーから必要なものを要求します。

MVC Model2が何であるか、それがMVPとどのように違うのかを実際に調べる必要があります。

0

あなたのオブジェクトをユーザーと見なす場合、モデルはユーザーの名前と電子メールを含むユーザーに関するすべての情報をカプセル化する必要があります。通常、名前フィールドを1つだけ持つのではなく、名前を姓と名に分割します。特定のモデルのフィールドがたくさんある場合は、実際には1つのモデルしか考えられないでしょうか?

あなたのモデルはあなたのパーシスタンス層のwhatsと一致している必要があり、モデルの下にORMを置くのが理想的です。これは、特定のデータベースベンダーロジックを使用することを避け、ある程度、SQLクエリの作成などを心配することなくあなたを抽象化します。

たとえば、Doctrine(PHP ORM)では、アノテーションを使用してORMにフィルタリングと検証の多くを渡すことができます。これは、そこにある多くのORMについて同じです。 Java用のHibernate

ORMの設定を正しく行うにはかなりの労力が必要ですが、そこに着くと価値があり、コードを大幅に洗練されたものにすることができます。

+0

ありがとうございます。私の質問は一般的なものでしたが、私は現在codeigniter PHPフレームワーク(データベースクラスを持っています)を使用しています。私はあなたが示唆するようにモデルを作成することは可能だとは思っていません - あなたと@immが示唆しているように - それははるかに良いアイデアのようです。 codeigniterの詳細についての情報はありますか? –

+0

正直言って、CodeIgniterはこれまで私が実際に使用したことのないものですが、グーグルがこのhttp://codeigniter.com/wiki/Using_Doctrine_with_Code_Igniterを見つけました。 Doctrineは1つのORMに過ぎません。負荷はもっとありますが、Doctrineは最大のものです。 – christophmccann

+0

クール、ありがとうございます。 :) very useful –

関連する問題