我目前正在驗證輸入,並在「脂肪控制器」如下返回錯誤:MVC驗證諮詢
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
的長度的要求發生變化,那麼顯然我將不得不改變我的模型。
我覺得這可能是一個很常見的問題,但我還沒有找到一個直截了當的答案。如果沒有實現任何額外的「層」,「映射器」或任何其他令人困惑的術語,那麼如何修改提供的示例僞代碼以正確處理此事務呢? (例如,驗證輸入,如果驗證失敗則返回錯誤)?
如果您想要一個簡單的一類解決方案,那麼它取決於您的RDBMS選擇。在oracle或postgresql中,你可以在表的'username'字段上設置'CONSTRAINT'。違反數據庫中的數據完整性會引發異常。不幸的是,我不確定是否有任何簡單的方法在mysql中執行相同的操作。這就是說,我必須問一件事:你到底聽說過「模型不應該改變」的地方?因爲那是BS。 –