Estou muito feliz em anunciar que acabei de lançar o 2.0.0-beta1 do Atlas, um mapeador de dados para o seu modelo de persistência SQL. Você pode obtê-lo via Composer como atlas/orm. Esta nova versão principal requer o PHP 7.1 e usa typehints, mas o melhor de tudo é ser compatível com as classes do Atlas geradas 1.x anteriores existentes!
I.
A motivação original para iniciar a série 2.x foi um erro de borda. O Atlas permite que você abra e gerencie transações em várias conexões simultaneamente; diferentes classes de tabela podem apontar para diferentes conexões de banco de dados. O Atlas também permite que você salve um Registro completo e todos os seus campos relacionados com uma única chamada para o método Mapeador ou Transação persist().
No entanto, em 1.x, executar uma chamada Transaction::persist() não funciona corretamente quando as relações são mapeadas em conexões que não são iguais ao Registro principal. Isso ocorre porque a Transação começa na conexão do Registro principal, mas não tem acesso às conexões para registros relacionados e, portanto, não pode rastreá-las.
É certo que esta é uma operação incomum, mas deve ser suportada corretamente. A única maneira de corrigir isso foi quebrar a compatibilidade inversa/anterior nas classes de Tabela e Transação, tanto em seus construtores, como em suas operações internas, introduzindo um novo ConnectionManager para usar para conexão e gerenciamento de transações.
II.
Enquanto as quebras de compatibilidade de versões anteriores aconteciam de qualquer maneira, isso criou a oportunidade de atualizar o pacote para usar o PHP 7.1 e os typehints. Mas mesmo com isso em mente:
- Você não precisa modificar ou regenerar nenhuma classe gerada a partir de 1.x (embora, se você tiver métodos de classe substituídos em classes personalizadas, talvez seja necessário modificar esse código para adicionar typehints).
- O Atlas 2.x continua a usar Aura.Sql e Aura.SqlQuery 2.x, então você não precisa alterar nenhuma consulta do Atlas 1.x.
- Você não precisa mudar nenhuma chamada para o AtlasContainer para configurar.
Portanto, a maioria do código existente usando o Atlas 1.x não deve ter que mudar em nada depois da atualização para 2.x.
III.
Existem algumas mudanças menores, mas que quebram, para os valores de retorno de algumas chamadas do Atlas; estes são os resultados do uso de typehints, especialmente tipos anuláveis.
Primeiro, os seguintes métodos agora retornam null (em vez de false) quando falham:
- Atlas::fetchRecord()
- Atlas::fetchRecordBy()
- Mapper::fetchRecord()
- Mapper::fetchRecordBy()
- MapperSelect::fetchRecord()
- RecordSet::getOneBy()
- RecordSet::removeOneBy()
- Table::fetchRow()
- Table::updateRowPerform()
- TableSelect::fetchOne()
- TableSelect::fetchRow()
Verificando valores de retorno vagamente false-ish continuarão a funcionar em 2.x como fizeram em 1.x, mas se você estava verificando estritamente para false, agora você precisa verificar estritamente para null – ou trocar para soltar a verificação. (Observe que os valores para um campo de registro relacionado faltante ainda são false, não são null. Ou seja, um valor de campo relacionado de null ainda indica “não houve tentativa de buscar por um registro relacionado”, enquanto false ainda indica “houve uma tentativa de buscar por um registro relacionado, mas ele não existe.”
Em segundo lugar, os seguintes métodos agora sempre retornarão um RecordSet, mesmo quando nenhum registro for encontrado. (Anteriormente, eles retornariam uma matriz vazia quando nenhum registro fosse encontrado).
- Atlas::fetchRecordSet()
- Atlas::fetchRecordSetBy()
- Mapper::fetchRecordSet()
- Mapper::fetchRecordSetBy()
- MapperSelect::fetchRecordSet()
Considerando que, anteriormente, você verificaria uma matriz vazia ou um valor false-ish como valor de retorno, agora você deve chamar isEmpty() no RecordSet retornado. Essa é a extensão das quebras de compatibilidade anteriores com o usuário.
IV.
Existe uma peça nova importante em 2.x: o ConnectionManager no nível da tabela. É responsável pelo gerenciamento de transações para operações de tabela e permite a configuração fácil de conexões de leitura e escrita para serem usadas para tabelas específicas, se desejado.
Ele também permite a substituição rápida de conexões “lidas” com conexões de “escrita”. Você pode especificar que isso deve:
- nunca acontecer (o padrão)
- sempre acontecer (o que é útil nas situações GET-após-POST quando a latência é alta para a replicação mestre-escravo), ou
- acontecer apenas quando uma tabela começou a escrever de volta para o banco de dados (o que é útil para sincronizar leituras com gravações em uma transação)
Além disso, você não deveria ter que lidar diretamente com o ConnectionManager, mas é bom saber o que está acontecendo subjacente.
V.
Embora este seja um lançamento importante, as mudanças de compatibilidade anteriores voltadas para o usuário são muito limitadas. Portanto, deve ser uma migração fácil de 1.x. Há poucas funcionalidades novas, então estou lançando isso como um beta em vez de um alfa. Ainda tenho que atualizar o site de documentação oficial, mas os documentos do pacote estão totalmente atualizados.
Não consigo pensar em nenhuma razão para esperar mudanças significativas da API entre agora e uma versão estável, que deve chegar nas próximas semanas se não houver relatórios substanciais de erros.
Obrigado pela leitura e espero que o Atlas possa ajudá-lo no seu próximo projeto!
***
Paul M. Jones faz parte do time de colunistas internacionais do iMasters. A tradução do artigo é feita pela Redação iMasters, com autorização do autor, e você pode acompanhar o artigo em inglês no link: http://paul-m-jones.com/archives/6698