Тред "Накажи меня" или "Найди 10 недочётов"

kode

never knows best
Тред "Накажи меня" или "Найди 10 недочётов"

Возрождаем тред. Только вот большая просьба, давайте без холиваров (типа throw vs trigger_error)

Пожалуй начну:

PHP:
//Smarty, ZF, gettext, самописная DBAL с конструктором запросов
//Данные экранируются на уровне специфичного для драйвера конструктора запросов (pg_escape_string)
//Те PgSQL_SQL extends BaseSQL{ public function safe($string){ return pg_escape_string(DB::driver()->getLink(), $string); }

public function buyAction(){
	//Throws exception if there is no such mobile, it means what ZF will show error page (404)
	$this->view->phone = $phone = $this->getPhone($this->_getParam("1"));
	if(!isset($_POST['buy_phone'])){
		return;
	}

	$errors = array();
	$insert = array();

	//Checking fullname
	if(empty($_POST['buy_fullname'])){
		$errors[] = _("Enter your Fullname");
	}else{
		$insert['fullname'] = $_POST['buy_fullname'];
	}

	//Checking Contact Phone
	if(empty($_POST['buy_phone'])){
		$errors[] = _("Enter your contact phone");
	}else{
		$insert['phone'] = $_POST['buy_phone'];
	}

	//Optional check
	if(!empty($_POST['buy_email'])){
		$email_validator = new Zend_Validate_EmailAddress();

		if(!$email_validator->isValid($_POST['buy_email'])){
			$errors[] = _("Enter valid EMail");
		}else{
			$insert['email'] = $_POST['buy_email'];
		}
	}

	//Also optional
	if(!empty($_POST['buy_comment'])){
		$insert['comment'] = $_POST['buy_comment'];
	}

	if(!empty($errors)){
		$this->view->errors = $errors;
		return;
	}

	$insert['mobile'] = $phone->id;
	$insert['date']   = DB::SQL_FUNCTION('now()');

	$db = Zend_Registry::get('db');
	$db->insert('orders',$insert);

	//Let's indicate what we succesfuly add their request to database
	$this->view->success = 1;
}
 

Alexandre

PHPПенсионер
[offtop]**** когда будет раздел Помидорник?

-~{}~ 18.03.08 18:24:

if(empty($_POST['buy_fullname'])){
$errors[] = _("Enter your Fullname");
}else{
$insert['fullname'] = $_POST['buy_fullname'];
}
похожие куски выделить в отдельный приватный метод ( например testFillField( <имя поля>) ).
 

kode

never knows best
похожие куски выделить в отдельный приватный метод ( например testFillField() ).
Это дело было, но иногда приходится делать специфичные для поля провеки. Хотя честно скажу что в другом контроллере так и сделано, только не через приватный метод а через Zend_Validate

-~{}~ 18.03.08 18:30:

пожалуй тоже переделаю, спасибо )
 

Alexandre

PHPПенсионер
if(!empty($_POST['buy_email'])){
$email_validator = new Zend_Validate_EmailAddress();

if(!$email_validator->isValid($_POST['buy_email'])){
$errors[] = _("Enter valid EMail");
}else{
$insert['email'] = $_POST['buy_email'];
}
}
выделить в отдельный метод, типа checkField( <fieldName>, class $checker )

написать класс $checker, который осуществляет типовые проверки:
- на мыло
- на урл
- на междунар. тел. номер
- на индекс
- на допустимый логин & etc.
$this->view->phone = $phone = $this->getPhone($this->_getParam("1"));
if(!isset($_POST['buy_phone'])){
return;
}
тоже выдетить в отдельный метод

в результате твой код превратится приблизительно в следующее:

-~{}~ 18.03.08 18:37:

PHP:
public function buyAction(){ 
    $errors = array();   // сделать приватным поле 
    $insert = array();  // сделать приватным поле 
    
     $this->checkPhone();
     $this->checkFillField( 'buy_email' );
      ...

     $this->checkField( 'buy_email' ,  new validator('email')  );
     $this->checkField( 'buy_www' ,  new validator('www')  );
    ...
   if(!empty($errors)){
        $this->view->errors = $errors;
        return;
    }

    $insert['mobile'] = $phone->id;
    $insert['date']   = DB::SQL_FUNCTION('now()');

    $db = Zend_Registry::get('db');
    $db->insert($this->insert);

    //Let's indicate what we succesfuly add their request to database
    $this->view->success = 1; 
}
ну как-то так...

-~{}~ 18.03.08 18:38:

if(!empty($errors)){
$this->view->errors = $errors;
return;
}
тоже выделить в отдельный метод checkErrors()

ну я бы приблизительно на такой структуре отсановился, хотя рефакторинг - это затухающий процесс, но близится к бесконечности...
 

kode

never knows best
Автор оригинала: Alexandre
выделить в отдельный метод, типа checkField( <fieldName>, class $checker )

написать класс $checker, который осуществляет типовые проверки:
- на мыло
- на урл
- на междунар. тел. номер
- на индекс
- на допустимый логин & etc.


тоже выдетить в отдельный метод

в результате твой код превратится приблизительно в следующее:

-~{}~ 18.03.08 18:37:

PHP:
public function buyAction(){ 
    $errors = array();   // сделать приватным поле 
    $insert = array();  // сделать приватным поле 
    
     $this->checkPhone();
     $this->checkFillField( 'buy_email' );
      ...

     $this->checkField( 'buy_email' ,  new validator('email')  );
     $this->checkField( 'buy_www' ,  new validator('www')  );
    ...
   if(!empty($errors)){
        $this->view->errors = $errors;
        return;
    }

    $insert['mobile'] = $phone->id;
    $insert['date']   = DB::SQL_FUNCTION('now()');

    $db = Zend_Registry::get('db');
    $db->insert($this->insert);

    //Let's indicate what we succesfuly add their request to database
    $this->view->success = 1; 
}
ну как-то так...

-~{}~ 18.03.08 18:38:


тоже выделить в отдельный метод checkErrors()

ну я бы приблизительно на такой структуре отсановился, хотя рефакторинг - это затухающий процесс, но близится к бесконечности...
думаю архитектурно неверно, для этого есть Zend_Validate, аля

class My_Validate_Buy_Form extends Zend_Validate_Abstract { ... }

$checker = new My_Validate_Buy_Form('buy_');
if(!$checker->isValid($_POST)){
$this->view->errors = $checker->getMessages();
return;
}

$insert = $checker->getInsert();
...

-~{}~ 18.03.08 18:56:

ноо так лень..... :D

-~{}~ 18.03.08 19:05:

А я вот знаю самую большую архитектурную ошибку, вижу вижу. За неё мне голову нужно оторвать )
 
Сверху