例如,如果我的控制器操作需要一个整数“id”参数,那么应该确保满足哪个要求?
也许在Controller Action中执行类似下面的操作?
if (isset($this->_getParam("id")) && is_numeric($this->_getParam("id"))) { ... }
那么id是否有效呢?例如。数据库中不存在该行?
答案 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)
这是两步......
像您一样或通过表单验证验证给定数据
通过SQL或模型实例检查数据库中的相应行
$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.
}
}
}
}
显然,这里要处理的逻辑要多得多,例如当事情无法验证时该怎么办。