MagicSQL: O pior framework de ORM e SQL para PHP.

Disclaimer: eu que fiz.

A muito tempo atrás, numa terra distante, um amigo me perguntou sobre Orientação a Objetos em PHP, e sobre ORM, como resposta eu fiz essa pequena biblioteca para demonstrar o básico do básico. O “framework” MagicSQL!

Sinceramente tenho vergonha dela, não era nada sério e nem tomei muitos cuidados na época com boas práticas e testes e documentação, era só para ver alguns recursos. Mas ela funciona e eu usei em alguns projetinhos(com isso ela até evolui um bocado), mas se for escolher algum ORM para PHP, faça uma escolha mais séria.

De qualquer forma estava revendo e resolvi publicar o código, “just because”. Você pode conferir o código no Repositório do MagicSQL. Vamos a uma análise chata:

Primeiro ponto: ela funciona. Como eu usei ela um pouco então o que está lá está funcionando nos casos testados(e mais alguns). Ela consegue fazer selects, updates, inserts, deletes e joins sozinha. E_STRICT.

Segundo ponto: não tem configuração. Nenhuma. Você cria a conexão no código mesmo (como se fosse PDO) e instancia o Repositório. O resto é mágica (e não confie em mágica). Ela advinha seu schema usando describe e show tables, e faz uns cálculos para adivinhar os joins (Essa é uma parte engraçada do código).

Not lazy: Cada “requisição” faz só uma query, mesmo com joins. Ou seja, mesmo quando você carrega uma lista de objetos com listas de objetos relacionados, não importa o tamanho do join, é uma query só e tudo é carregado numa tacada só e transformado em objetos. Não queira ver esse código também.

StdClass pública: ele não usa seus objetos, apenas StdClass com atributos públicos. Whatever.

PDO e ArrayObject: Toda lista e resultado são ArrayObject (na verdade MagicCollection), então $arr[0] == $arr->get(0). Sua conexão é um PDO, caso você precise.

Quase sem documentação: Acho até que tem alguns comentários quaisquer, mas não tem PHPDoc e a documentação em si é quase nula. Mas está lá no README, example.php e test.php.

Noob testing: Bom, pelo menos tem testes unitários (ou algo parecido). Na época não tinha escolhido um framework, e como foi algo bem rápido e sujo, tem só um monte de chamadas com ifs e testes para saber se tudo correu bem. Tem até um teste que ainda falha por que nunca precisei da sua implementação (ou porque perdi a implementação).

MySql e SQLite: O objetivo inicial foi o sqlite, depois o MySql porque é o que mais uso. Apesar de usar PDO o método de “discovery” do schema não é padrão.

Usem um ORM PHP de verdade, e não esse, mas o código está ai para sua diversão.