I am working on saving state of an object to a database using the data mapper pattern, but I am looking for suggestions/guidance on the validation and error message generation step (step 4 below). Here are the general steps as I see them for doing this:
(1) The data mapper is used to get current info (assoc array) about the object
in db:
+=====================================================+
| person_id | name | favorite_color | age |
+=====================================================+
| 1 | Andy | Green | 24 |
+-----------------------------------------------------+
mapper returns associative array, eg. Person_Mapper::getPersonById($id) :
$person_row = array(
'person_id' => 1,
'name' => 'Andy',
'favorite_color' => 'Green',
'age' => '24',
);
(2) the Person object constructor takes this array as an argument, populating its fields.
class Person {
protected $person_id;
protected $name;
protected $favorite_color;
protected $age;
function __construct(array $person_row)
{
$this->person_id = $person_row['person_id'];
$this->name = $person_row['name'];
$this->favorite_color = $person_row['favorite_color'];
$this->age = $person_row['age'];
}
// getters and setters...
public function toArray()
{
return array(
'person_id' => $this->person_id,
'name' => $this->name,
'favorite_color' => $this->favorite_color,
'age' => $this->age,
);
}
}
(3a) (GET request) Inputs of an HTML form that is used to change info about the person is populated using Person::getters
<form>
<input type="text" name="name" value="<?=$person->getName()?>" />
<input type="text" name="favorite_color" value="<?=$person->getFavColor()?>" />
<input type="text" name="age" value="<?=$person->getAge()?>" />
</form>
(3b) (POST request) Person object is altered with the POST data using Person::setters
$person->setName($_POST['name']);
$person->setFavColor($_POST['favorite_color']);
$person->setAge($_POST['age']);
*(4) Validation and error message generation on a per-field basis
- Should this take place in the person object or the person mapper object?
- Should data be validated BEFORE being placed into fields of the person object?
(5) Data mapper saves the person object (updates row in the database):
$person_mapper->savePerson($person);
// the savePerson method uses $person->toArray()
// to get data in a more digestible format for the
// db gateway used by person_mapper
Any guidance, suggestions, criticism, or name-calling would be greatly appreciated.