我目前正在“胖控制器”中验证输入并返回错误,如下所示:
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
发生变化,那么显然我将不得不改变我的模型。
我觉得这可能是一个非常普遍的问题,但我还没有找到一个直截了当的答案。如果不实现任何额外的“层”、“映射器”或任何其他令人困惑的术语,如何修改提供的示例伪代码以正确处理此事务?(例如,验证输入,如果验证失败则返回错误)?