Construindo um Mapa de Identidade em PHP

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