创建一个简单的MVC - 不确定验证实现

时间:2014-01-03 13:01:05

标签: php validation model-view-controller

我正在创建一个简单的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);
      }
   }
}

1 个答案:

答案 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个字符的用户名,但他们的用户将无法查看未完成注册的原因。