0

そのため、私は独自の MVC フレームワークを調査して構築することに取り組んできましたが、それを実装する 6 つの異なる方法に遭遇し続けています。はい、Zend などを使用できることはわかっていますが、他の人のフレームワークを使用するだけでなく、フレームワークがどのように機能するかを本当に学びたいと思っています。

これが私のインデックスファイルの単純なバージョンです:

if(isset($_GET['url']))
{
    $url = strtolower($_GET['url']);
}
else
{
    $url = 'home';
}

switch($url)  // Select the controller based on the GET var in the url
{
    case 'home': include(ROOT_DIR . 'app/controllers/homeCon.php'); // This page has the link to the DB test page on it
        break;
    case 'dbtest': include(ROOT_DIR . 'app/controllers/dbTestCon.php');
        break;
    default: include(ROOT_DIR . 'app/views/error404View.php');
}

これは、私の dbTestCon.php コントローラーの単純なバージョンです。

if(isset($_POST['dbSubBtn']))
{
    $model = new DbTestModel();

    if($_POST['firstName'] != '' && $_POST['lastName'] != '')
    {
        $model->submitToDb($_POST['firstName'], $_POST['lastName'])
        $model->displayPage('goodToGo');
    }  
    else
    {
        $model->displayPage('noInput');
    }
}
else
{
    $model->displayPage('normal');
}

ここに私のDbTestModel.phpがあります:

class DbTestModel
{
    public function displayPage($version)
    {
        $title = "DB Test Page";
        $themeStylesheetPath = 'public/css/cssStyles.css';

        include(ROOT_DIR . 'app/views/headerView.php');
        include(ROOT_DIR . 'app/views/dbTestView.php');

        switch($version)
        {
            case 'goodToGo':
                include(ROOT_DIR . 'app/views/dbTestSuccessView.php');
                break;
            case 'noInput':
                include(ROOT_DIR . 'app/views/noInputView.php');
                break;
        }
        include(ROOT_DIR . 'app/views/footerView.php');
    }

    public function submitToDb($firstName, $lastName)
    {
        try 
        {
            $db = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASS); 
            $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

            $sql = $db->prepare('insert into dbtest(firstName, lastName) values(:firstName, :lastName)');
            $sql->bindParam(':firstName', $firstName);
            $sql->bindParam(':lastName', $lastName);
            $sql->execute();
            $db = null;
        }
        catch(PDOException $e)
        {
            echo "It seems there was an error.  Please refresh your browser and try again. " . $e->getMessage();
        }
    }
}

そして、ここに私の dbTestView.php があります:

<form name="dbTestForm" id="dbTestForm" method="POST" action="dbtest">
    <label for="firstName">First Name</label>
    <input type="text" name="firstName" id="firstName" />
    <label for="lastName">Last Name</label>
    <input type="text" name="lastName" id="lastName" />
    <input type="submit" name="dbSubBtn" id="dbSubBtn" value="Submit to DB" />
</form>

この単純な例は私のテスト環境で動作しますが、次のプロジェクトで使用を開始し、途中でフレームワークに根本的な問題があり、最初からやり直す必要があることに気付くのではないかと心配しています。助けやアドバイスをありがとう。

4

2 に答える 2

1

いいえ、それは正しい方法ではありません!

  • 完全に不十分なルーティング メカニズム:

    現在のコードベースでは、すべてのコントローラーを手動で登録する必要があります。これにより、ブートストラップ ステージ ( index.phpファイル) が明らかに混乱し、エラーが発生しやすくなります。

  • 「モデル」レンダリング テンプレートがあります

    これは、MVC 設計パターンの最も原始的な解釈であっても間違っています。ビューは、「モデル」と呼ばれるものによってレンダリングされるテンプレートではなく、プレゼンテーション ロジックを含むインスタンスであると想定されています。

  • モデルはレイヤーであり、単一のクラスではありません

    MVC のデザインパターンは、プレゼンテーション層とモデル層の 2 つの層で構成されています。モデル レイヤーにはすべてのドメイン ビジネス ロジックが含まれ、何らかの形の抽象化を通じてストレージと対話します。

  • 毎回 DB 接続を再初期化しないでください。

    「モデル」は、データベースを操作する必要があるたびに新しい PDO インスタンスを初期化します。代わりに、接続インスタンスを一度だけ作成し、コンストラクターを介して各オブジェクトに渡す必要があります。

  • 警告やエラー メッセージが表示されないコードを書くのはやめましょう。

于 2012-09-09T13:29:58.660 に答える
0

通常、データ ストレージ (モデル ロジックなど) と出力 (ビュー ロジックなど) の両方を同じ場所で行うのは悪い形式と見なされますが、これは DbTestModel で発生しています。

あなたができるリファクタリングは絶対にたくさんありますが、段落を書くことになるので、詳しく説明するつもりはありません。

Fabien Potiencer のブログ シリーズCreate your own framework... on top of the Symfony2 Componentsを読むことをお勧めします。

彼のコンポーネントを使用して何かを構築したくない場合でも、良いアイデアが山ほど得られるはずです。

于 2012-09-04T00:27:52.253 に答える