Integrando o Doctrine ORM e Laravel 5 [parte-1]

· 5 minutos de leitura
Integrando o Doctrine ORM e Laravel 5 [parte-1]

Fala galera, estou a um tempinho sem escrever nada, vida corrida, faculdade e tudo mais, porém trago a vocês hoje um breve tutorial de como integrar o Doctrine ao Laravel 5, vamos nessa!

O que é o Doctrine ?

Antes de mais nada gostaria de falar um pouco sobre o projeto Doctrine. O Doctrine é um conjunto de vários projetos para se trabalhar especificamente com banco de dados, sejam ele relacionais como o MySQL e PostgreSQL ou não relacionais como o MongoDB.

A grande vantagem de se usar suas bibliotecas é o ganho de abstração, facilmente você pode trocar entre bancos sem problema nenhum, e caso você use o Doctrine ORM, você pode recriar a estrutura do seu banco de dados a partir de suas classes mapeadas, e como de é de se esperar, você não precisará escrever diretamente nenhum comando SQL.

Por que usar o Doctrine no Laravel se já existe o Eloquent ?

Dado uma breve explicação do que é o Doctrine, e caso você já conheça ou trabalhe com o Laravel, provavelmente você vai se perguntar, por que diabos eu usaria o Doctrine se o Laravel vem com o Eloquent por padrão? Bem, para dizer a verdade tudo depende, no meu caso por exemplo um dos maiores motivos de usar o Doctrine inicialmente foi o suporte ao banco de dados Sybase, contudo, e com o tempo, percebi que o Doctrine estava muito mais avançado do que o Eloquent, o que não é de se estranhar já que o Doctrine é um conjunto de bibliotecas dedicadas para um único propósito, além de ser um projeto mais antigo que o próprio Laravel, e com uma gama muito maior de projetos que o utilizam, abaixo eu listo algumas poucas vantagens que eu identifiquei no Doctrine ORM especificamente:

  1. Suporte a um número maior de banco de dados relacionais e não relacionais
  2. Possibilita tornar um banco relacional, um banco orientado a objetos
  3. Cria uma portabilidade da estrutura do seu banco de dados através do mapeamento de classes
  4. Maior gama de projetos que o utilizam, exemplo: Symfony

Integrando no Laravel

Obs.: Não estarei aqui mostrando inicialmente grandes detalhes de como utilizar o Doctrine, mas para os interessados existe um tutorial no site do projeto disponível neste link.

Mãos na massa

Como de praxe vamos criar um novo projeto usando o composer, considerarei que você já o possui instalado, caso não, sugiro ver esse post, após tudo instalado, execute o seguinte comando:

composer create-project laravel/laravel –prefer-dist tutorial-doctrine

Isto criará uma pasta chamada “tutorial-doctrine”, fará o download do Laravel e fará a instalação de suas dependências.

A seguir precisaremos adicionar a dependência do Doctrine ORM, para isso execute o comando abaixo no terminal, na pasta que acabou de ser criada.

composer require doctrineorm ~2.5

Após o termino da instalação, crie um arquivo chamado “cli-config.php” na pasta raiz do projeto. Esse arquivo basicamente fará a configuração e possibilitará o acesso via console das funcionalidades do Doctrine. Depois disso copie o código abaixo para o arquivo:

1
2
3
4
5
6
<?php
require 'vendor\autoload.php';
require __DIR__ . '/bootstrap/app.php';
$provider = new App\Providers\DoctrineServiceProvider($app);
$entityManager = $provider->getEntityManager();
return \Doctrine\ORM\Tools\Console\ConsoleRunner::createHelperSet($entityManager);

Agora precisaremos criar um ServiceProvider, ou uma classe que dará acesso ao EntityManager do Doctrine, para isso execute o comando abaixo na raiz do projeto.

php artisan make:provider DoctrineServiceProvider

Isto criará um novo arquivo em “app/Providers”, agora copie o código abaixo para o arquivo.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<?php namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;

class DoctrineServiceProvider extends ServiceProvider {
  private $entityManager;

  public function getEntityManager()
  {
                //Caminho para a pasta de models/entities, está pasta não existe na instalação do Laravel e pode ser criada em "app/Http/Models"
    $path = array(__DIR__."/../Models");
                //Verifica se a aplicação está com d
    $debug = isset($_ENV['APP_DEBUG']) ? $_ENV['APP_DEBUG'] : true;
    //Array com as configurações de banco de dados
    $database_array = require __DIR__ . '/../../config/database.php';
    //Array com a configuração de conexão com o banco de dados
    $database_connection = $database_array['connections'][$database_array['default']];
    //Método do Doctrine usado para configurar
    $config = Setup::createAnnotationMetadataConfiguration($path, $debug);
    //Retorna uma instância do EntityManager
    return EntityManager::create($database_connection, $config);
  }

  /**
   * Bootstrap the application services.
   *
   * @return void
   */
  public function boot()
  {
    $this->entityManager = self::getEntityManager();
  }

  /**
   * Register the application services.
   *
   * @return void
   */
  public function register()
  {
    $this->app->singleton('Doctrine\ORM\EntityManagerInterface', function($app){
      return $this->entityManager;
    });
  }
}

Obs.: O código está comentado e caso necessitem tirar alguma dúvida, por favor escrevam nos comentários estarei atendendo o quanto antes for possível.

Agora para testarmos vamos alterar o arquivo de configuração de conexão com banco de dados do Laravel em “configdatabase.php”. Basicamente precisamos alterar duas coisas: mudar o valor da posição “default” para “sqlite” e alterar o driver da posição “sqlite” na lista de conexões de “sqlite” para utilizar o “pdo_sqlite”, que é o driver do Doctrine para se trabalhar com o SQLite.

Por fim apenas execute o comando abaixo para criar o arquivo do banco de dados na pasta “storage”.

touch storage/database.sqlite

Finalmente vamos rodar um comando do Doctrine para verificar se está tudo certo.

vendorbindoctrine orm:validate-schema

Caso esteja tudo certo será impresso no terminal uma mensagem dizendo que está tudo OK.

Bem pessoal, essa foi um introdução da integração do Doctrine com o Laravel 5, aguardem os próximos posts, segam-nos nas redes e até a próxima o.