Я посмотрел на свой новый дизайн кода и вот новые проблемы, которые я нашел.
Во-первых, в вашей функции register вы используете переменную ошибок как целое число, а функция validate возвращает массив. Здесь у вас есть две возможности.
Вы можете изменить метод регистра, чтобы проверить, если ваш массив ошибок пуст, как это:
if(empty($errors)) {
//first validation
}
Граф также действует, но я до сих пор предпочитаю пустой, так как это синтаксически яснее. Кроме того, функция count возвращает 1, если параметр не является массивом или счетным объектом, или 0, если параметр равен NULL. Как я уже сказал, это функциональное решение в вашем текущем случае, но в некоторых других контекстах это может привести к неожиданным результатам.
Здесь, в объявлении метода, я вижу, что вы ожидаете логическое (botProtection).
public function validateUser($data, $botProtection = true) {
Но поставляют параметр ошибки
if($instance->validateUser($data, $errors)) {
Вы не предоставляют мне декларацию ошибок переменных, но это, вероятно, не соответствующий параметр защиты бота ваша функция ожидает. PHP использует терять типизацию, это полезно, но, опять же, вы должны быть осторожны с ошибками, которые трудно найти.Для публичной функции вы всегда должны убедиться, что параметр, предоставленный вами, не приведет к сбою кода.
В вашем коде параметр данных представляется массивом. Вы можете использовать параметр намекая, чтобы заставить использовать массив как это:
public function register(array $data) {
public function validateUser(array $data, $botProtection = true) {
и даже определенный класс (как если вы где использование «экземпляр» в состоянии)
public function register(MyDataClass $data) {
public function validateUser(MyDataClass $data, $botProtection = true) {
Кроме того, вы» даже не используя параметр botProtection в вашем методе validateUser.
В тот же вызов функции:
if($instance->validateUser($data, $errors)) {
вы ожидаете булево (истина или ложь), но этот метод возвращает массив. Если вы хотите использовать код так, как это в настоящее время разработано, вы должны использовать его как этот
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)
Ну, у меня ушло два часа напишите это. Надеюсь, у вас есть достаточно материала для создания эффективного, многоразового и, не менее важного, безопасного кода.
Хороший успех,
Джонатан Родитель-Левек из Монреаля
Пожалуйста, покажите больше кода, ваша структура кода прямо сейчас неясно. Связаны ли 2 файла PHP? Или есть две разные страницы? –
Нам действительно нужно больше вашего кода, чтобы быть в состоянии сказать. Где вы называете функцию регистрации? Не могли бы вы разместить полный код othervalidation.php? – BurningLights
Я попытался отредактировать сообщение, чтобы сделать его более понятным. – Taq