現在、次のように「ファットコントローラー」で入力を検証し、エラーを返しています。
class SomeController
{
public function register()
{
// validate input
$username = isset($_POST['username']) && strlen($_POST['username']) <= 20 ? $_POST['username'] : null;
// proceed if validation passed
if (isset($username)) {
$user = $this->model->build('user');
if ($user->insert($username)) {
$_SESSION['success'] = 'User created!';
} else {
$_SESSION['error'] = 'Could not register user.';
}
} else {
$_SESSION['failed']['username'] = 'Your username cannot be greater than 20 characters.';
}
// load appropriate view here
}
}
class SomeModel
{
public function insert($username)
{
// sql for insertion
// ...
return $result;
}
}
これは機能し、実装するのは簡単ですが、次のように「ファット モデル」を使用して修正しようとしているモデルに検証が属しているため、これは正しくないことを理解しています。
class SomeController
{
public function register()
{
$user = $this->model->build('user');
$user->insert($_POST['username']);
// load appropriate view here
// ...
}
}
class SomeModel
{
public function insert($username)
{
// validate input
$error = false;
$username = trim($username) != '' && strlen($username) <= 20 ? $username : null;
// proceed if validation passed
if (isset($username)) {
// sql for insertion
// ...
$_SESSION['success'] = 'User created!';
} else {
// store error in session
$error = true;
$_SESSION['error']['username'] = 'Your username cannot be greater than 20 characters ';
}
return $error ? false : true;
}
}
ここで私が目にする問題は、モデルを変更する必要がないという点で、モデルが移植可能であると想定されていることです。しかし、長さの要件が$username
変更された場合、明らかにモデルを変更する必要があります。
これは本当によくある質問だと思いますが、まだ簡単な答えを見つけていません。余分な「レイヤー」、「マッパー」、またはその他の紛らわしい用語を実装せずに、このトランザクションを正しく処理するために、提供されている擬似コードの例をどのように変更できますか? (例: 入力を検証し、検証が失敗した場合はエラーを返します)?