0

MVC を簡単な方法で理解するために (私は自分自身のデモ アプリケーションを作成しようとしています)、Symfony2 のSymfony2 対 Flat PHPの資料に従いました。「改善」しようとして途中でいくつかのものを変更しました。いくつかの OOP プラクティスを追加するコードでは、DB クラスを作成し、モデルを次のように変更しました。

<?php
// model.php
function open_database_connection()
{
    $link = mysql_connect('localhost', 'myuser', 'mypassword');
    mysql_select_db('blog_db', $link);

    return $link;
}

function close_database_connection($link)
{
    mysql_close($link);
}

function get_all_posts()
{
    $link = open_database_connection();

    $result = mysql_query('SELECT id, title FROM post', $link);
    $posts = array();
    while ($row = mysql_fetch_assoc($result)) {
        $posts[] = $row;
    }
    close_database_connection($link);

    return $posts;
}

これに(スペイン語は無視してください):

<?php
/**
 * @author Me
 * 
 */
/**
 * post.php: clase post, elemento de texto básico del blog
 */
class Post
{
    /**
     * titulo del post
     * @var string
     */
    private $title;

    /**
     * Constructor de la clase Post
     * @param string $title
     */
    function __construct($title)
    {
       $this->title = $title;
    }

    /**
     * Get para titulo del post.
     * @return string
     */
    public function getTitle()
    {
        return $this->title;
    }

    /**
     * Set para titulo del post.
     * @param  string $title
     * @return self
     */
    public function setTitle($title)
    {
        $this->title = $title;
        return $this;
    }

    public function getAllPosts()
    {
        //Ummm what?
    }
}

私の問題は、このgetAllPosts()メソッドが私のモデル post.php のどこに収まるかということです。何が間違っているのでしょうか? 頭に浮かんだ唯一のことは、メソッドを静的として作成することでしたが、それは意味がなく、そのようにすべきではないことを私は知っています...

事前に感謝します。この MVC 全体を理解しているようです。Web 開発における MVC のような構造は、私にかなりの問題を引き起こしています...

注: これは Symfony とはまったく関係ありません。単純な MVC のような実装 (ビューの作成方法を含む) に従おうとしているだけです (これは明らかに MVC を実装する「純粋な」方法ではありません)。

4

3 に答える 3

0

MVC は、ビジネス層 (モデル)、UI (ビュー)、コードナー (コントローラー) を分離するアーキテクチャ パターンであることを覚えておく必要があります。モデルはポリモーフィックであることに注意してください。つまり、単なるデータベースではありません。

MVC 自体は、関心の分離 (SoC) の原則の実装です。Flat php (または実際には任意の言語) が行うことは、 Transaction Scriptと呼ばれ、単純な (スクリプト作成) タスクにのみ適しています。

多くの (複雑な) 機能を提供する仮想製品であり、時間の経過とともに要件が変化するアプリケーションが必要な場合は、他のものを壊さずに変更できる適切なアーキテクチャが必要です。

あなたのコードでは、 getAllPosts メソッドは関心の分離と単一責任原則 (SRP) の違反です。なぜなら、Post のモデリングに加えて、永続性を処理するタスクもあるからです。

MVC では、モデルとビューを分離し、コントローラーを使用してこれら 2 つを調整するように指示されています。これはまた、コントローラーが管理作業、つまりモデルの選択とビュー (または別の結果) の選択のみを行う必要があることも意味します。些細な宿題のプロトタイプ アプリでない限り、データ アクセスを Controller に配置しないでください。必要なことだけを実行して、コントローラーをスリムに保ちます。コントローラーに 10 行を超えるコードがある場合は、実行しすぎている可能性が高くなります。

MVC は非常に単純なパターンであり、それを尊重する規律を維持するのははるかに困難です。

于 2013-05-17T08:01:59.847 に答える
0

オブジェクトを 2 つ作成する必要があります。

  • エンティティ オブジェクト - データベース内の投稿を表す、作成したオブジェクト。
    • getTitle()
    • setTitle(タイトル)
  • データ アクセス オブジェクト - データベース内の Post エンティティを管理するクラス (createPost)。
    • getAllPosts()
    • savePost(投稿)
于 2013-05-17T07:00:57.467 に答える
-2

MVC 構造の「M」(モデル) 部分のみを実装しました。いくつかのエンティティに関する機能は、ブラウザーの要求を取得するコントローラーに任せるのが最善です。したがって、次のようなクラスを追加できます (優れたDoctrine DBALアクセス レイヤーを使用):

class PostController {
  private $myDb;

  public function __construct(Doctrine\DBAL\Connection $db) {
    $this->myDb = $db;
  }

  public function get() {
    if (!isset($_REQUEST['id'])) {
      $allPosts = $this->myDb->fetchAll('SELECT * FROM Post');
    }
    // pass $allPosts to the view layer...
  }
}

Doctrine ガイドでは、ビジネス ロジックをコントローラーに追加することについて明示的に警告しているため、私の個人的な意見では、すべてのレコードを取得するような単純なコードはコントローラーに問題なく入ることができます。Post次に、列値の配列を受け入れるコンストラクターを使用して、モデル インスタンスでデータをラップできます。その後、すべてのロジックでエンティティを推奨どおりに使用できます。

データベース アクセス コードがより洗練され、同じコード スニペットを常にコピーしていることに気付いた場合は、別のデータ アクセス レイヤーを構築するという StaNov の提案から始めることができます。それまでは、本当にお勧めです

  1. ライブラリに固執して、低レベルのデータベース アクセスを行う
  2. ジョブを完了できる最も単純なコードを使用してください。複雑さはすぐにあなたを悩ませます。
于 2013-05-17T07:01:20.587 に答える