Configurando Doctrine ORM no silex

Por Jean Hertel, 15/02/2017

silex , doctrine

Olá leitores,

Hoje vou mostrar uma maneira simples e fácil de configurar o ORM do Doctrine no framework Silex.

Por padrão o Silex já traz um provider chamado DoctrineServiceProvider. Este provider nos permite conectar a uma base de dados com o Doctrine DBAL. Isto por si só já é uma mão na roda para ter uma abstração melhor da base de dados, mas não dá nenhuma melhoria significativa em relação a gestão dos objetos criados. Para esta finalidade, existe o Doctrine ORM, que faz o encapsulamento de toda essa tradução de consultas no banco para objetos php.

Para instalar o ORM existem diversas opções de providers, sendo possível até mesmo configurar tudo na mão. Para o nosso exemplo vamos usar o Doctrine ORM Service Provider do dFlyDev.

Antes de mais nada, instale o pacote com o comando:

composer install dflydev/doctrine-orm-service-provider

Existem diversas opções de configurações, e não vou falar de todas elas. A que eu uso normalmente é a leitura das entidades através de annotations.

<?php
$app->register(new DoctrineOrmServiceProvider, [
  'orm.proxies_dir'             => 'src/App/Entity/Proxy',
  'orm.auto_generate_proxies'   => $app['debug'],
  'orm.em.options'              => [
    'mappings' => [
      [
        'type'                         => 'annotation',
        'namespace'                    => 'App\\Entity\\',
        'path'                         => 'src/App/Entity',
        'use_simple_annotation_reader' => false,
      ],
    ],
  ]
]);

Com o código acima iremos registrar o ORM para ler as annotations das clases que se encontrem no diretorio src/App/Entity com o namespace App\Entity.

Por fim, o Doctrine não vai conseguir localizar nossas classes apenas com as informações acima, ele precisa de um class Loader. Como estamos usando o composer, podemos utilizar seu class Loader da seguinte forma:

<?php
use Doctrine\Common\Annotations\AnnotationRegistry;

$loader = require_once __DIR__ . '/vendor/autoload.php';
AnnotationRegistry::registerLoader([$loader, 'loadClass']);

Você pode ver um exemplo completo e funcional neste link.