The document discusses different design patterns for data persistence in PHP applications. It begins by describing the Active Record pattern, which combines the domain model and persistence model but has drawbacks. Next, it covers the Data Mapper pattern, which decouples the domain and persistence models but can result in duplicate objects. The rest of the document focuses on the Identity Map pattern, which solves this issue by storing loaded objects in a map to ensure single instances. It provides examples of how to implement the Identity Map within the find, insert, update, and delete methods of a Data Mapper class.
3. Active-Record Pattern
+ insert()
+ update()
+ delete()
+ Table properties
- No separation of
concerns.
- Difficult testing
without a database.
-------------------------------
= For systems with
simpler domain logic.
20.04.2012 Gjero Krsteski 3
4. Data-Mapper Pattern
+ Decouples domain model class from the persistence store.
+ For systems with complex domain logic where the shape
of the domain model will diverge from the database model.
20.04.2012 Gjero Krsteski 4
5. Data-Mapper Pattern problem
$personMapper = new PersonMapper($pdo);
$person1 = $personMapper->find(1); // creates new object
$person2 = $personMapper->find(1); // creates new object
echo $person1->getLastName(); // Joe
echo $person2->getLastName(); // Joe
$person1->setLastName('Bob');
echo $person1->getLastName(); // Bob
echo $person2->getLastName(); // Joe -> ?!?
20.04.2012 Gjero Krsteski 5
6. Identity-Map Pattern
+ Ensures that each object gets
loaded only once by keeping
every loaded object in a map.
+ Looks up objects using the
map when referring to them.
20.04.2012 Gjero Krsteski 6
8. Data-Mapper Pattern with Identity-Map
$personMapper = new PersonMapper($pdo);
$person1 = $personMapper->find(1); // creates new object
$person2 = $personMapper->find(1); // returns same object
echo $person1->getLastName(); // Joe
echo $person2->getLastName(); // Joe
$person1->setLastName('Bob');
echo $person1->getLastName(); // Bob
echo $person2->getLastName(); // Bob -> yes, much better
20.04.2012 Gjero Krsteski 8
9. Implementation of Identity-Map into find()
public function find($id)
{
// If the ID is in the Identity-Map,
// then return the object from the Identity-Map.
// If not, then trie to fetch the object from the database.
// If not found in the database,
// than throw an exception -> no object with id=x exists!
// If found in the database, then register the object in to the Identity-Map.
// Return the object.
}
20.04.2012 Gjero Krsteski 9
10. Implementation of Identity-Map into insert()
public function insert(Person $person)
{
// Check if the object is not in the Identity-Map,
// otherwise throw an exception -> object has an id, cannot insert!
// Store the object in the database.
// Then register the object in the Identity-Map.
// Return the new object.
}
20.04.2012 Gjero Krsteski 10
11. Implementation of Identity-Map into update()
public function update(Person $person)
{
// Check whether the object is in the Identity-Map,
// if not, then throw an exception -> object has no id, cannot update!
// Otherwise, update the object in the database.
// Return true.
}
20.04.2012 Gjero Krsteski 11
12. Implementation of Identity-Map into delete()
public function delete(Person $person)
{
// Check whether the object is in the Identity-Map,
// if not, then throw an exception -> object has no id, cannot delete!
// Otherwise, delete the object in the database.
// Return true.
}
20.04.2012 Gjero Krsteski 12
13. Thank you for your attention!
Gjero Krsteski
Programmer, Consultant, Trainer
Homepage: krsteski.de
E-Mail: gjero@krsteski.de