Este código de exemplo não é um código de produção e deve ser usado apenas para fins de treinamento. https://github.com/gjerokrsteski/php-identity-map
Este exemplo de código requer:
- PDO uma interface leve e consistente para acessar bancos de dados em PHP.
- PHPUnit uma estrutura de teste de unidade para projetos PHP.
Este exemplo de código implementa:
- Padrão Data-Mapper
- Padrão de Mapa de Identidade
Por que mapeamento de identidade?
Usando o padrão Data-Mapper sem um mapa de identidade, você pode facilmente ter problemas porque pode ter mais de um objeto que faz referência à mesma entidade de domínio.
Mapeador de dados sem mapa de identidade
$userMapper = new UserMapper($pdo);
$user1 = $userMapper->find(1); // creates new object
$user2 = $userMapper->find(1); // creates new object
echo $user1->getNickname(); // joe123
echo $user2->getNickname(); // joe123
$user1->setNickname('bob78');
echo $user1->getNickname(); // bob78
echo $user2->getNickname(); // joe123 --------> what ?!#?
Mapeador de dados com mapa de identidade
O mapa de identidade resolve esse problema agindo como um registro para todas as instâncias de domínio carregadas.
$userMapper = new UserMapper($pdo);
$user1 = $userMapper->find(1); // creates new object
$user2 = $userMapper->find(1); // returns same object
echo $user1->getNickname(); // joe123
echo $user2->getNickname(); // joe123
$user1->setNickname('bob78');
echo $user1->getNickname(); // bob78
echo $user2->getNickname(); // bob78 --------> yes, much better :-)
Ao usar um mapa de identidade, você pode ter certeza de que sua entidade de domínio será compartilhada por todo o aplicativo durante a solicitação.
Observe que usar um mapa de identidade não é o mesmo que adicionar uma camada de cache aos mapeadores. Embora o armazenamento em cache seja útil e encorajado, ele ainda pode produzir objetos duplicados para a mesma entidade de domínio.
Carregue os mapeadores de dados com a classe Repository
$repository = new Repository($this->db);
$userMapper = $repository->load('User');
$insertId = $userMapper->insert(new User('billy', 'gatter'));
Padrões de design PHP comprovados para persistência de dados por @gjero_krsteski em @slideshare #oop #php http://de.slideshare.net/gjerokrsteski/proven-design-patterns-of-the-datalayer-in-php