我正在创建一个简单的MVC应用程序来了解有关MVC的更多信息。 我有一个控制器,它使用UserService类来获取所需的用户:
class UserController extends Controller{
public function Index(){
$data['users'] = UserService::getAll();
$this->view->render($data);
}
public function Add(){
UserService::insert($_POST['username'],$_POST['password']);
}
}
UserService类使用ORM(idiorm)来获取数据:
class UserService{
public static function getAll(){
return Model::factory('User')->find_many();
}
public static function insert($username,$password){
$user = Model::factory('User')->create();
$user->username = $username;
$user->password = $password; //no good practice in real life offcourse...
return $user->save();
}
}
我如何在这里进行一些验证?就像检查值是否为空,密码与某个验证模式匹配一样,......
我应该这样做:
//控制器
public function Add(){
if(UserValidationService::checkPassword($_POST['password'])){
UserService::insert($_POST['username'],$_POST['password']);
}else{
//set some errordata and show the view
}
}
或者我应该在服务(模型)中进行验证并返回错误吗?
我对如何正确验证我感到有点困惑。
代码更新
class UserController extends Controller{
public function Add(){
$result = UserService::insert($_POST['username'],$_POST['password']);
if($result[0]){
//result ok, show view
}else{
//result not ok, pass errors to view
}
}
}
class UserService{
$errors = "";
public static function insert($username,$password){
if(empty($username)){
$errors .= "Please enter a username.";
}
if(empty($password)){
$errors .= "Please enter a password.";
}
if(empty($errors)){
$user = Model::factory('User')->create();
$user->username = $username;
$user->password = $password; //no good practice in real life offcourse...
$user->save();
return array(true,$user);
}else{
return array(false,$errors);
}
}
}
答案 0 :(得分:1)
对此类约束的验证应该是基于模型的验证。这是因为您不能依赖单个控制器将使用单个模型的东西。
您可以在5个不同的页面上使用您注册用户的模型,依赖于5个不同的控制器。甚至是第三方。在每个控制器中进行验证将是一种过度杀伤力。您只需要处理模型的返回值。
在您的模式中,您可以
if(empty($param)) {
return array(false, self::EMPTY_PARAM);
}
if(strlen($param)<self::MINIMUM_LENGTH) {
return array(false, self::MINIMUM_LENGTH_NOT_REACHED);
}
所以在您的控制器中,您正在检查:
if(!$model_response[0]) {
return json_encode(array('success' => 0, 'error_msg' => 'Error message, or the constant value from the model, or something else to get proper error message'));
}
您可以通过仅返回false来简化,我添加的示例是处理不同的错误,因此您可以向视图发送正确的字符串/ json。
/* $model_response here is the return value of the model
* I did not used associative array returning so
* if the model return the one I said, the first key (`0`)
* will be false. So we are checking if the first key is false
* then testing the second key (`1`) what is its return value
* in order to handle the error (it's mostly a pseudo code)
*/
if(!$model_response[0]) {
switch($model_respose[1]):
case UserModel::EMPTY_PARAM:
$error_msg = 'Username or password cannot be empty';
break;
case UserModel::MINIMUM_LENGTH_NOT_REACHED:
$errpr_msg = 'Username and password should be at least' . UserModel::MIN_LENGTH . 'characters long';
break;
endswitch;
return json_encode(array('success' => 0, 'error_msg' => $error_msg));
}
因此,您只需按模型设置约束(EMPTY_PARAM,MIN_LENGTH等...)并由控制器处理它们。你可以决定不处理其中的一些。无论如何,模型将返回false,但最终用户将看不到正确的消息。
因此,如果第三方使用您的模型,即您有合作伙伴并且他们有门并使用您的模型为您带来注册,并且他们忘记告诉用户最小长度为6个字符,他们仍然无法在您的应用中插入少于6个字符的用户名,但他们的用户将无法查看未完成注册的原因。