Каковы общие шаблоны для проверки в модели в PHP? - PullRequest
0 голосов
/ 14 ноября 2009

В настоящее время я создаю объект и использую его установщики для установки данных get / post, полученных от клиента. И вызовите validate () перед вызовом функции save () следующим образом:

//member registration
$m=new Member();
$m->setName($_POST['name']);
$m->setBirthDate($_POST['birthdate']);
$m->setAddress($_POST['address']);

$arrOfErrMsgs=$m->validate();

if(!empty($arrOfErrMsgs)){
//echo some error messages to client or redirect to a page that shows the error
exit();
}

$saveSuccess=$m->save(); //to be safe, inside this save function, it will also call validate() again before saving, so that even someone forgot to call validate() before calling save() by mistake, no dirty data will appear in the database 

if($saveSuccess){
//echo a success message to client or redirect to a success page

}else{
//echo save failed message to client (normally this should not happen unless db server suddenly fails)
}

exit();

Пока это работает, но должны быть некоторые альтернативы. Например, может быть, некоторые из проверок могут быть выполнены в установщиках.

Я хотел бы знать, какие шаблоны для проверки в модели в PHP являются наиболее распространенными?

Ответы [ 4 ]

2 голосов
/ 14 ноября 2009

Я не рекомендую этот способ проверки ваших моделей.

Во-первых, контроллер должен проверить входные данные, чтобы убедиться, что это строка, когда она должна быть, целое число, когда оно должно быть, и так далее. Но НЕ бизнес логика.

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

Например, если у вас была другая информация, например firstHeardOf (когда они впервые услышали о каком-либо сайте, членом которого они становятся), установщик должен убедиться, что это действительная дата и ПОСЛЕ даты рождения, по крайней мере. Это создает проблему упорядочения методов, и требование вызова методов в определенном порядке не является хорошей практикой, вместо этого конструктор можно использовать для гарантии упорядочения вызовов.

Метод save теперь является простым методом, он сохраняет данные, и действительно, почему он должен нести какую-либо другую ответственность. Самое большее, он должен дважды проверить, что созданный член все еще действителен, и именно здесь вы можете захотеть вставить код проверки конструктора в закрытый / защищенный метод проверки и вызвать его в обоих местах.

Быстрое слово об обязанностях и о том, как они распадаются здесь, по крайней мере, в моей голове:

  • Конструктор отвечает за создание допустимого / правильно инициализированного объекта Member
  • Установщики отвечают за установку допустимых данных в объекте-члене для данных
  • Метод save отвечает за сохранение действительного объекта члена
2 голосов
/ 14 ноября 2009

Контроллер должен проверять, модель не должна обрабатывать любые недоверенные данные.

1 голос
/ 17 ноября 2009
<?php

abstract class Model {

    protected $errors = array();

    public function validate() {
        // Implement validation logic, overriden in subclasses
    }

    public function isValid() {
        $this->validate();
        return empty($this->errors);
    }

    public function save() {
        if (!$this->isValid()) {
            return false;
        }

        // Perform the saving operation
    }
}

class Member extends Model {

    // setters and getters and constructor

    public function validate() {
        if (empty($this->name)) {
            $this->errors[] = 'name can not be empty';
        }
    }
}

$member = new Member(array(
    'name' => 'Hanse'
));

if ($member->save()) {
    // Print success messages
} else {
    // Print error messages
    print_r($member->getErrors());
}

Я предпочитаю подход, описанный выше. Дает вам чистый и гибкий API.

1 голос
/ 14 ноября 2009

Я думаю, что это идеальный способ проверки бизнеса. Возможно, ваш метод save() мог бы вернуть строку с сообщением об ошибке, если данные недействительны, иначе true (сохраняя избыточный вызов validate()). Это тот подход, который я сейчас использую, хотя он действительно зависит от того, как вы хотите разработать свой API. Пока это предсказуемо и имеет смысл.

Как прокомментировал erenon, модель не должна выполнять низкоуровневую проверку, такую ​​как проверка на наличие целых чисел, форматов дат, вредоносного кода и т. Д. - они принадлежат в другом месте (например, Zend_Form ). Однако для проверки бизнеса, такой как member must be over 21 years old, я не вижу проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...