0

悪いコード プラクティスを防ぐために、プロジェクトを進める前に明確にしたいことがあります。以前はRuby on Railで開発しましたが、学習を始めたのでPHPと同じようにできるか知りたいのですが、Zend、Yiiなどのフレームワークを使いたくないのです。

私にとって、モデルはデータがデータベースに挿入される場所です。

コントローラーは、すべてのパラメーターを検索し、モデル内の関数を使用してデータをデータベースに処理する場所です。また、プロシージャがリターンの成功または失敗の場合にもルーティングまたはリダイレクトします。

view は、コントローラーで初期化するインスタント変数を取得し、それを使用してデータを適切な形式でレンダリングする場所です。

だから、ここでPHPで私に質問します。PHP で CRUD を作成したいと思います。多くの記事や投稿 (stackoverflow など) を調べましたが、一部の人々が別の種類のことを言っていることに混乱しました。

私の考えでは、モデルはデータベースへのデータの挿入/クエリにのみ関連する場所です。したがって、作成、表示、更新、削除のすべてのクエリをモデルに入れます。これが私のモデルの create_user 関数の例です。

function create_user($firstName, $lastName,$username, $password){
    $query = "INSERT INTO `users` (`user_id`, `first_name`, `last_name`, `email`, `username`, `password`, `created_at`, `handphone_no`, `street_address`, `city`, `state`, `country`, `postal`, `birthday`, `company_id`)
            VALUES (NULL, ?, ?, NULL, ?, ?, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 2)";

    if($stmt = $this->conn->prepare($query)) {
        $stmt->bind_param('ssss', $firstName, $lastName,$username, $password);
        $stmt->execute();
    }

} 

だから、私の最初の質問:私のモデルでは、私はオブジェクトに仮定してコントローラーに渡しますか?? または単に true または false を返して、プロセスの成功または失敗を示します。

私のユーザーコントローラーで、

class Users_controller {

private $user;

function __construct(){
    $this->user = New User();
}

function create($firstName, $lastName,$username, $password){
    $this->user->create_user($firstName, $lastName,$username, $password);
}
}

私の2番目の質問:私のCRUDの場合、レールでは、オブジェクトのIDを見つけて表示/編集するか、新しいモデルを作成/破棄します。では、ここのコントローラーは、データを表示するためにオブジェクトを返す必要がありますか? フォームをコントローラーに接続する方法を教えてください。私のフォームからパラメーターをコントローラーに渡します。

だから、今のところ私はそれについてのみ考えています。ありがとうございます...

4

2 に答える 2

0

わかりました、うまくいけば、この答えはあまり長くはありませんが、ここで...

まず、RoR は実際にはフレームワークであるため、PHP でそれに最も近いものはフレームワークになります。ただし、PHP には Rails のクローン (またはそれに近いもの) はありません。また、ほぼすべての PHP フレームワークが MVC を実装していると主張していますが、実装しているものはほとんどありません。それらのほとんどは、横行するSOLID違反やその他のあらゆる種類の問題を伴う、MVC の何らかの修正および簡略化されたバージョンを示しています。この回答では、MVC のこれらのバリエーションを略して「FMVC」と呼びます。そうは言っても、永続的なモデルが必要なため、適切な MVC を PHP で使用することは技術的に不可能です。(注: PHP でこれを行うことができますが、簡単ではなく、醜い/「ハッキーな」コードになる可能性があります)。

学習したい場合は、次のことをお勧めします。プロジェクトを念頭に置いている場合は、一般的に魅力的なフレームワークを選択して、それを使用してください。徹底的に学び、ソースコードに飛び込み、コードの一部をレビューしてもらい、その特定のフレームワークの否定論者を (ほとんど) 無視するようにしてください。私が「ほとんど」と言ったのは、MVC や OOP-PHP 全般を本当に学びたいのであれば、既存の実装を見て、コードの良い部分、悪い部分、醜い部分を真に理解することが最善の方法だからです。これがあなたに与えるものは、SOLID原則とSOLID違反に関する知識の堅実な(しゃれを許して)基礎です.

独自の MVC フレームワークを作成する場合、または MVC 全般について学習する場合は、最初に理解しておくべきことがいくつかあります。

  1. OPでは、モデルが正確に何であるかを誤解しているようです。MVC パターンでは、「M」(モデル) はレイヤーです。長くて非常に正確なモデルの説明が必要な場合は、tereško によるこの投稿を参照してください。これは、現在 SO に関する最良の回答です。要するに、モデル層は多くの部分、つまりデータ マッパー、ドメイン オブジェクト、および「サービス」で構成されています。データ マッパーは、FMVC の「モデル」クラスに似ています。データベース クエリが含まれています。ドメイン オブジェクト基本的には、ドメイン データの単なるコンテナです。「サービス」は、モデル レイヤーとの相互作用のポイントです。何かを行うためにサービスを呼び出すと、サービスはモデル レイヤー内で作業を行います。通常、サービスの外部でデータ マッパー (またはドメイン オブジェクト) を直接呼び出すことはありません。

  2. CRUD は概念ではなく、クラスに含めるメソッドのリスト (作成、読み取り、更新、削除) です。データ マッパーには一般に CRUD メソッドが含まれます (さらに拡張するとサービスも含まれますが、もう少し抽象的な場合もあります)。

  3. 繰り返しますが (非常に重要なので)、適切な MVC を実装している PHP フレームワークはほとんどありません。この方法で FMVC を学ぶことはできますが、適切な MVC は、彼らが実装するものとはかけ離れています。

  4. OOP と SOLID の原則を完全に理解していない場合、MVC でのコーディングは悪夢になります。MVC を学習したい場合は、OOP の基本に戻って再学習または更新することを最初に行う必要があります。

具体的な質問について:

  1. この質問は本当に意味がありません。モデル層への呼び出しは、サービスを介して行われます。サービスは通常、処理のためにドメイン オブジェクトを関連するデータ マッパーに渡します。データ マッパーは、ドメイン オブジェクト (すべての結果データを含む) を、モデル レイヤーの外部から呼び出されたサービスに返します。

  2. この質問も意味がありません。以前にリンクした投稿を読むと、混乱の一部が解消されるはずです。

tl;dr -この投稿を読んでください。

于 2012-08-16T17:34:23.670 に答える
0

RoR もフレームワークであるため、PHP フレームワークを使用したくない理由がわかりません。

私は以前に独自の PHP フレームワークを開発したことがありますが、経験上、アプリケーションに非常に具体的な要件がない限り、一般的には悪い考えであることがわかります。

Yii を試すことをお勧めします。Yii はコーディングがかなり自由です。

とにかく、あなたの質問に答えるには:

最初に、クラスごとに再作成するのではなく、CRUD を行う汎用モデル クラスを作成します。したがって、たとえば、使用可能なプロパティを定義する (または DB から直接取得する) と、主キーの値の存在に基づいて挿入または更新を行う汎用の「保存」機能があります。

次に、保存するときに、成功した場合は true を返し、無効なデータ/検証の場合は false を返し、SQL 要求が失敗した場合は例外をスローする必要があります。

フォームからコントローラへのデータの受け渡しは POST を介して行われ、値がオブジェクトに注入されます。そこから、オブジェクトが DB に存在するかどうかを確認できます。

HTH

于 2012-08-16T16:50:42.383 に答える