如果MVC / Zend Framework中存在必需/有效(URL)参数,谁应该进行管理

时间:2011-01-10 13:03:06

标签: model-view-controller zend-framework web-applications

例如,如果我的控制器操作需要一个整数“id”参数,那么应该确保满足哪个要求?

也许在Controller Action中执行类似下面的操作?

 if (isset($this->_getParam("id")) && is_numeric($this->_getParam("id"))) { ... }

那么id是否有效呢?例如。数据库中不存在该行?

3 个答案:

答案 0 :(得分:2)

只需使用

即可
$validator  = new Zend_Validate_Digits();
$id = $this->_getParam("id") ; 
$valid = $validator->isValid($id);
if($valid){
  // its valid number 
}else{
// its not valid number 
}

如果id存在或不存在于db中,则有一些validator 此示例使用zend_db,您可以编写自定义验证器

//Check that the email address exists in the database
$validator = new Zend_Validate_Db_RecordExists(
    array(
        'table' => 'users',
        'field' => 'emailaddress'
    )
);

if ($validator->isValid($emailaddress)) {
    // email address appears to be valid
} else {
    // email address is invalid; print the reasons
    foreach ($validator->getMessages() as $message) {
        echo "$message\n";
    }
}

答案 1 :(得分:1)

这是两步......

  1. 像您一样或通过表单验证验证给定数据

  2. 通过SQL或模型实例检查数据库中的相应行

  3. $row = $db->fetchRow($db->select()->where('ID= ?', $id));

    echo count($row); // check count

    echo !empty($row); // untested ...should work to

答案 2 :(得分:1)

理论上,您的控制器应该能够处理通过URL发送的任何数据。通常,我在使用它之前验证数据的相关性(即,它是一个合法的数据库ID,名称,命令等吗?)。我从来没有真正感觉到需要对url参数进行基线类型验证。测试NULL当然是个好主意,尽管如果值为null,getParam允许你指定默认值。

无论如何,如果必须的话,我会这样做。 注意:我实际上没有测试过这段代码。这都是“理论上的”。

我会将类型信息传递到路由对象的defaults数组中。

// assuming you're using an ini config for routes
routes.myroute.defaults.arg_types.id[] = 'integer'

// so your 'defaults' array will looks like:

Array(
  [controller] => mycontroller
  [action] => myactions
  [arg_types] => Array 
  (
      [id] => Array
      (
          [0] => notnull
          [1] => integer 
      )

  )

)

然后我会编写一个Controller插件,根据我们在调度循环中指定的配置数据来验证每个参数:

public function preDispatch($request)
{
    $params = $request->getParams();
    $route = Zend_Controller_Front::getInstance()->getRouter()->getCurrentRoute();
    $type_args = $route->getDefault('type_args');


    foreach($params as $param) {
      if (!in_array($param, $type_args)) {
        continue;
      }

      foreach($type_args[$param] as $type) {
        switch($type) {
          case 'notnull':
             // validate for null
             break;
          case 'integer':
             // validate for integer
             break;
          // etc.
        }
      }
    }


}

显然,这里要处理的逻辑要多得多,例如当事情无法验证时该怎么办。