我有一个带有public function register($data)
的php文件(register.php),其中验证了错误。然后计算错误,如果没有找到错误,则通过验证。
register.php:
class ARegister {
public function register($data) {
$user = $data['userData'];
//validate provided data
$errors = $this->validateUser($data);
if(count($errors) == 0) {
//first validation
}
}
public function validateUser($data, $botProtection = true) {
$id = $data['fieldId'];
$user = $data['userData'];
$errors = array();
$validator = new AValidator();
if( $validator->isEmpty($user['password']) )
$errors[] = array(
"id" => $id['password'],
"msg" => Lang::get('password_required')
);
return $errors;
}
问题是,我需要将已验证数据的确认信息发送到我的其他php文件(othervalidation.php),我已经进行了另一次验证:
othervalidation.php:
<?php
require 'register.php';
if ( !empty($action) ) {
switch ( $action ) {
case 'process_payment':
try {
$instance = new ARegister();
if($instance->validateUser($data, $errors)) {
throw new Exception('Validation error');
}
} catch (Exception $e) {
$status = false;
$message = $e->getMessage();
}
}
如何将$ errors变量的结果发送到我的其他验证(othervalidation.php)?
答案 0 :(得分:0)
您可以尝试这样的事情:
class ARegister {
private $error = 0;
public function register($data) {
if (!$this->validateUser($data)){
$this->error++;
}
}
public function getErrorCount(){
return $this->error;
}
public resetErrorCount(){
$this->error = 0;
}
或者通过引用传递错误:
public function register(&$error, $data) {
if (!$this->validateUser($data)){
$error++;
}
}
就个人而言,我会在同一个方法中进行所有验证(在封装类中),使用错误消息参数(通过引用传递)来返回验证失败的原因并使用return语句返回true或false。
class MyClass{
public function validation(&$errorMessage, $firstParameter, $secondParameter){
$success = false;
if (!$this->firstValidation($firstParameter)){
$errorMessage = "this is not working pal.";
}
elseif (!this->secondeValidation($firstParameter)){
$errorMessage = "Still not working buddy...";
}
else{
$success = true;
}
return $success;
}
private function firstValidation($firstParameter){
$success = false;
return $success;
}
private function secondeValidation($secondParameter){
$success = false;
return $success;
}
}
在您的其他档案中:
<?php
$instance = new MyClass();
$errorMessage = "";
if ($instance->validation($errorMessage, $firstParameter, $secondParameter)){
echo "Woot, it's working!!!";
}
else{
echo $errorMessage;
}
?>
这些代码解决方案之一是否符合您的需求?
来自蒙特利尔的Jonathan Parent-Lévesque
答案 1 :(得分:0)
我查看了你的新代码设计,这是我发现的新问题。
首先,在您的注册函数中,您将validate变量用作整数,而validate函数返回一个数组。你有两种可能性。
您可以更改注册方法,以检查错误数组是否为空:
if(empty($errors)) {
//first validation
}
Count也有效,但我仍然喜欢空,因为它在语法上更清晰。此外,如果参数不是数组或可数对象,则count函数返回1,如果参数为NULL,则返回0。正如我所说,它是当前案例中的一种功能性解决方案,但在其他一些情况下,它可能会导致意外结果。
在你的方法声明中,我看到你期待一个布尔值(botProtection)。
public function validateUser($data, $botProtection = true) {
但是你提供了一个错误参数
if($instance->validateUser($data, $errors)) {
您没有向我提供errors变量的声明,但它可能与您的函数所期望的bot保护参数不匹配。 PHP正在使用输入输入,它很有用,但是,再次,你必须小心很难找到的错误。对于公共函数,您应始终确保提供的参数不会导致代码崩溃的方式。
在您的代码中,data参数似乎是一个数组。您可以使用参数提示强制使用这样的数组:
public function register(array $data) {
public function validateUser(array $data, $botProtection = true) {
甚至特定的类(就好像你在条件中使用“实例”一样)
public function register(MyDataClass $data) {
public function validateUser(MyDataClass $data, $botProtection = true) {
另外,你甚至没有在validateUser方法中使用botProtection参数。
在同一个函数调用上:
if($instance->validateUser($data, $errors)) {
您期望一个布尔值(true或false),但该方法返回一个数组。如果您想按照当前设计的方式使用代码,您必须像这样使用它
if(!empty($instance->validateUser($data, $errors)) {
在这里,我不太确定是否有必要使用异常。设计这样的代码不是更容易吗?
if(!empty($instance->validateUser($data, $errors)) {
$message = 'Validation error';
}
在验证功能中,“isEmpty”功能是否也验证客户端是否提供了密码?
如果是这种情况,您可以像这样验证它:
if(!in_array($user['password']) or empty($user['password']))
通过这些更正,您的代码应该正常运行。
以下是我如何设计代码的示例(考虑提供的代码示例):
class ARegister {
public function register($data) {
$user = $data['userData']; //don't declare it here, all the user validations must be done in validateUser($data, &$errors)
$errors = array();
if($this->validateUser($data, $errors)) {
//first validation
}
}
/**
* Note: If you are not returing more than one error at the time, $errors should be a string instead of an array.
*/
public function validateUser($data, array &$errors) {
$isValid = false;
if (in_array($data['fieldId']) and in_array($data['fieldId']['password']) and in_array($data['userData'])){
if(!in_array($data['userData']['password']) or empty($data['userData']['password'])){
$errors[$data['fieldId']['password']] = Lang::get('password_required');
}
else{
$isValid = true;
}
}
else{
//an invalid data array had been provided
}
return $isValid;
}
对于下一部分,如果代码直接在视图中执行并且您是初学者,则创建一个程序外部控制器文件(所有函数都将公开...)。如果您是专业人士,您必须创建一个类来封装治疗。
您不能直接在视图中进行治疗。视图是一个愚蠢的占位符,用于数据表示和收集客户端的输入。它必须做的唯一动作是显示控制器发送的数据,并将客户端的输入发送回控制器。
数据处理是控制人员的责任。
if (!empty($action) ) {
$errors =array();
switch ( $action ) {
case 'process_payment':
$instance = new ARegister();
if($instance->validateUser($data, $errors)) {
//the user is valid, do the treatment
}
else
PageManager::dispayError($errors);
}
unset($instance);
}
}
以下是一个如何集中显示错误的示例
/**
* Can be more complexe than that, but I'm at my father's home at four hundred kms away from Montreal right now..
*/
public static function dispayError($errors, $size = 4){
if (is_numeric($size)){
if ($size < 0){
$size = 1;
}
elseif($size > 5){
$size = 5;
}
}
else{
$size = 4;
}
if (is_scalar($errors)){
echo '<h' . $size . 'class="ERROR_MESSAGE">' . $errors . '</h' . $size . '><br>';
}
elseif (is_array($errors)){
foreach ($errors as $error){
if (is_scalar($error)){
echo '<h' . $size . 'class="ERROR_MESSAGE">' . $error . '</h' . $size . '><br>';
}
}
}
}
当然,您也可以支持多种消息:
public static function dispayError($errors, $size = 4){
self::displayMessage("ERROR_MESSAGE", $errors, $size=4);
}
private static displayMessage($class, $messages, $size=4)
好吧,花了我两个小时才写出来。我希望你现在有足够的资料来构建一个高效,可重用且同样重要的安全代码设计。
成功,
来自蒙特利尔的Jonathan Parent-Lévesque