私はPHPベースのModel-View-Controller構造化Webサイトで作業しています。私は、モデルがビジネスロジックを処理し、HTML(または何でも)をユーザに提示し、コントローラがこれを容易にすることを理解する。私が立ち往生している場所は形である。 コントローラーにどのくらいの処理を加え、モデルをどのくらい入れますか?MVC Webサイトでフォーム提出を検証して処理する場所
ユーザーの最初の&の姓を更新しようとしているとします。私がしたいのは、AJAXを使って私のコントローラの1つにフォームを送信することです。私は、データを(もう一度)サーバ側で検証し、有効な場合はデータベースに保存してから、JSON応答を成功またはエラーとしてビューに返します。
コントローラに自分のユーザーモデルのインスタンスを作成するか、モデルの静的メソッドにコントローラをリレーするだけでよいですか?
オプション#1:モデルのProcess POST
<form action="/user/edit-user-form-submit/" method="post">
<input type="text" name="firstname">
<input type="text" name="lastname">
<button type="submit">Save</button>
</form>
<?php
class user
{
public function __construct($id){} // load user from database
public function set_firstname(){} // validate and set first name
public function set_lastname(){} // validate and set last name
public function save_to_database(){} // save object fields to database
public static function save_data_from_post()
{
// Load the user
$user = new user($_POST['id']);
// Was the record found in the db?
if($user->exists)
{
// Try to set these fields
if(
$user->set_firstname($_POST['firstname'])
and
$user->set_lastname($_POST['lastname'])
)
{
// No errors, save to the dabase
$user->save_to_database();
// Return success to view
echo json_encode(array('success' => true));
}
else
{
// Error, data not valid!
echo json_encode(array('success' => false));
}
}
else
{
// Error, user not found!
echo json_encode(array('success' => false));
}
}
}
class user_controller extends controller
{
public function edit_user_form()
{
$view = new view('edit_user_form.php');
}
public function edit_user_form_submit()
{
user::save_data_from_post();
}
}
?>
オプション#1:モデルのProcess POST
<form action="/user/edit-user-form-submit/" method="post">
<input type="text" name="firstname">
<input type="text" name="lastname">
<button type="submit">Save</button>
</form>
<?php
class user
{
public function __construct($id){} // load user from database
public function set_firstname(){} // validate and set first name
public function set_lastname(){} // validate and set last name
public function save_to_database(){} // save object fields to database
}
class user_controller extends controller
{
public function edit_user_form()
{
$view = new view('edit_user_form.php');
}
public function edit_user_form_submit()
{
// Load the user
$user = new user($_POST['id']);
// Was the record found in the db?
if($user->exists)
{
// Try to set these fields
if(
$user->set_firstname($_POST['firstname'])
and
$user->set_lastname($_POST['lastname'])
)
{
// No errors, save to the dabase
$user->save_to_database();
// Return success to view
echo json_encode(array('success' => true));
}
else
{
// Error, data not valid!
echo json_encode(array('success' => false));
}
}
else
{
// Error, user not found!
echo json_encode(array('success' => false));
}
}
}
?>
2ここでは、これは仕事ができるかの2つの例であります例はまったく同じことをします、私はそれを実現します。しかし、これを行う正しい方法と間違った方法がありますか?私はスキニーコントローラと脂肪モデルについて多くのことを読んできましたが、オプション#1はどこから来ましたか。どのようにこれを扱っていますか?ありがとう、そして長い質問のために申し訳ありません!
入力いただきありがとうございます。モデル内のグローバルにアクセスしないことを知っておくとよいでしょう...それは理にかなっています。サービスクラスに関する面白い考え。サービスクラスの機能を1つのメソッド(つまり、配列から新しいユーザーを作成する)に限定するか、update_user_from_arrayのような他の関数を追加するのは意味がありますか?また、これらの関数の両方に対して、配列内の特定の数の値を強制的に渡すか、関数に渡されたものを単純に処理させますか?(firstnameとlastname、別の時刻のユーザー名とパスワード) – Jonathan
一般に、サービスには、通常、特定のタイプのモデルに関連する任意の数のメソッドが含まれます。たとえば、ユーザーモデルとやり取りするさまざまな方法を含むユーザーサービスを作成できます。私は、メソッドの配列は任意の数の値を含むことができると思うが、実際に必要な値を確認し、必要な値がmissngの場合は、例外をスローする必要があります。この概念は、より多くの情報を検索する場合は、「サービス層」と呼ばれます。 –
サービスレイヤー、これは決して考えられませんでした!しかし、複数のドメインモデルを扱うときに通常使用されるサービス層ではありませんか?私はそのアイデアが気に入っていますが、それは典型的な小さなウェブアプリでは過度のものでしょうか? – Jonathan