0

私は良いMVCパターンを知りません、今学びます...だから、私は作りたいです:データベースから行を取得し、結果がない場合(0行)は「結果がありません」と出力し、そうでない場合は結果を出力します。

モデルには、このphpコードがあります

function getAutos () {
    //here connect to database

    $res = $this->db->query("SELECT names FROM auto");
    if ($res->num_rows == 0) {
        return "we have no results";
    }
    else {
        return $res;
    }

}

この関数はオブジェクトまたは文字列を返しますよね? 今、私は作る:

<!--some html code -->
<?php
$resultFromGetAutos  = /*result from function getAutos ()*/

if (is_object(resultFromGetAutos)) {
     while ($row = resultFromGetAutos->fetch_assoc()) {
         echo row['names']."<br>";
    }
}
else {
    echo resultFromGetAutos;
}
?>
<!--some html code -->

それは機能しますが、私が理解しているように、ビュー内の多くのPHPコードは正しいMVCではif (is_object(Resultat)) {do something} else { do other something } ありません. 正しくない場合、そのような状況でどのように正しい方法がありますか?

4

2 に答える 2

3

MVC のモデルは、クラスまたはオブジェクトではありません。モデルはlayerで、アプリケーション内のすべてのドメイン ビジネス ロジックが含まれます。データベースと対話する可能性がありますが、どの時点でも直接接続を作成するべきではありません。この投稿を読むかもしれません。いくつかの指示が含まれます。

ここでの肝心な点は、あなたが「モデル」と呼んでいるものは、元のコンセプトにさえ近づいていないということです.

ビューに関しては、適切な MVC (または MVC にインスパイアされた) パターンの実装では、ビューがすべてのプレゼンテーション ロジックを担当します。これは、ビューがユーザーに表示される内容を決定することを意味します。これは、モデル レイヤーから情報を取得することによって決定されます(従来の MVC および Model2 MVC では直接要求し、MVP および MMVM パターンではコントローラーのような構造を介して取得します)

Web アプリケーションでは、ビューが応答を作成します。応答の形式は、使用された要求またはインターフェースの for に基づいて異なります。View は、複数のテンプレートを組み合わせて応答を作成するか、HTTP ロケーション ヘッダーを送信するだけです。

于 2012-10-13T11:43:43.717 に答える
1

MVC 設計の原則の 1 つは、モデルとビューが互いに直接アクセスせず、互いのことを認識していないことです。
ほとんどの場合、ビューは最も愚かです。表示しているデータを理解するのではなく、「データ」をどのように表示するかだけを理解する必要があります。
autos が必要な場合は、ビューによって認識されるコントローラーが必要です。次に、コントローラはモデルに autos を要求し、返されたモデルの値を解析して、ビューが直接表示できる形式にする必要があります。
または、これらの autos を既にページの読み込みに使用する必要がある場合は、コンストラクター (例) を介して実行します。次のよう
になります。

<View> // you shouldn't include that, that's just that readers notice it is the view.
<?php
    // a bunch of other code
    function AutoView($whatViewShouldDisplay) { // should be the constructor, OOP PHP is not my strongest point
        $content = $whatViewShouldDisplay;
        echo $content;
    }
?>

<Controller>
<?php
    // Bunch of other code
    function AutoController() { // should-be constructor
        $model = new AutoModel();
        $result = $model->getAutos();
        if ($result->num_rows != 0) {
            while ($row = resultFromGetAutos->fetch_assoc()) {
                $viewContent .= row['names']."<br>";
            }
        }
        else {
            $viewContent = "Sorry, no results found.";
        }

        $view = new AutoView($viewContent);
    }
?>

<Model>
<?php
    // Bunch of other code
    function getAutos() {
         return $this->db->query("SELECT names FROM auto");
    }
?>

getAutos()ご覧のとおり、モデルが SQL 結果セットを返すメソッドを実装し、ビューに 1 つの引数のコンストラクターがある限り、それらをすべてに置き換えることができます!

または、コードを念頭に置いて:

<!--some html code -->
<?php
$text  = $controller->requestContentForThisPlace(); // Something like getMainContent()? I don't know where this is on your page.

echo $text;
?>

コードのコントローラーは、次のメソッドを実装します。

function requestContentForThisPlace() {
    $result = $model->getAutos();
    if ($result->num_rows != 0) {
        while ($row = resultFromGetAutos->fetch_assoc()) {
            $content .= row['names']."<br>";
        }
    }
    else {
        $content = "Sorry, no results found.";
    }

    return $content;
}
于 2012-10-13T11:58:30.047 に答える