Você está na página 1de 11

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

28 de maio de 2015 (http://blog.butecopensource.org/integrando-o-doctrine-orm-e-laravel-5-parte-1/)


Jonathan Schweder (http://blog.butecopensource.org/author/jonathanaschweder/) Desenvolvimento
(http://blog.butecopensource.org/categoria/desenvolvimento/)

Fala galera, estou a um tempinho sem escrever nada, vida corrida, faculdade e tudo mais, porm
trago a vocs 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 vrios projetos para se trabalhar especificamente com banco de dados, sejam ele relacionais
como o MySQL e PostgreSQL ou no relacionais como o MongoDB.
A grande vantagem de se usar suas bibliotecas o ganho de abstrao, 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 no
precisar escrever diretamente nenhum comando SQL.

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


Dado uma breve explicao do que o Doctrine, e caso voc j conhea 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 padro? 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 avanado do que o Eloquent, o que no de
se estranhar j que o Doctrine um conjunto de bibliotecas dedicadas para um nico propsito,

alm de ser um projeto mais antigo que o prprio Laravel, e com uma gama muito maior de projetos
que outilizam, abaixo eu listo algumas poucas vantagens que eu identifiquei no Doctrine ORM
especificamente:
1. Suporte a um nmero maior de banco de dados relacionais e no relacionais
2. Possibilita tornar um banco relacional, um banco orientado a objetos
3. Cria uma portabilidade da estrutura do seu banco de dados atravs do mapeamento de
classes
4. Maior gama de projetos que o utilizam, exemplo: Symfony

Integrando no Laravel
Obs.: No estarei aqui mostrando inicialmente grandes detalhes de como utilizar o Doctrine, mas
para os interessados existe um tutorial no site do projeto disponvel neste link (http://docs.doctrineproject.org/en/latest/#getting-started).

Mos na massa
Como de praxe vamos criar um novo projeto usando o composer, considerarei que voc j o possui
instalado, caso no, sugiro ver esse post (http://blog.butecopensource.org/controle-de-dependenciaem-php-usando-o-composer/), aps tudo instalado, execute o seguinte comando:
composercreateprojectlaravel/laravelpreferdisttutorialdoctrine

Isto criar uma pasta chamada tutorial-doctrine, far o download do Laravel e far a instalao de
suas dependncias.
A seguir precisaremos adicionar a dependncia do Doctrine ORM, para isso execute o comando
abaixo no terminal, na pasta que acabou de ser criada.
composerrequiredoctrine\orm~2.5

Aps o termino da instalao, crie um arquivo chamado cli-config.php na pasta raiz do projeto. Esse
arquivo basicamente far a configurao e possibilitar o acesso via console das funcionalidades do
Doctrine. Depois disso copie o cdigo abaixo para o arquivo:
1
2
3
4
5
6
7
8
9
10
11

<?php
require'vendor\autoload.php';
require__DIR__.'/bootstrap/app.php';
$provider=newApp\Providers\DoctrineServiceProvider($app);
$entityManager=$provider>getEntityManager();
return\Doctrine\ORM\Tools\Console\ConsoleRunner::createHelperSet($entityManager);

cliconfig.php
viewraw(https://gist.github.com/jaschweder/929ee31d0e88d439580b/raw/cliconfig.php)
(https://gist.github.com/jaschweder/929ee31d0e88d439580b#filecliconfigphp)hostedwith byGitHub
(https://github.com)

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.

phpartisanmake:providerDoctrineServiceProvider

Isto criar um novo arquivo em app/Providers, agora copie o cdigo 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
48
49
50
51
52
53
54
55

<?phpnamespaceApp\Providers;
useIlluminate\Support\ServiceProvider;
useDoctrine\ORM\Tools\Setup;
useDoctrine\ORM\EntityManager;
classDoctrineServiceProviderextendsServiceProvider{

private$entityManager;

publicfunctiongetEntityManager()

{
//Caminhoparaapastademodels/entities,estpastanoexistenainstalaodoLara

$path=array(__DIR__."/../Models");
//Verificaseaaplicaoestcomd

$debug=isset($_ENV['APP_DEBUG'])?$_ENV['APP_DEBUG']:true;

//Arraycomasconfiguraesdebancodedados
$database_array=require__DIR__.'/../../config/database.php';

//Arraycomaconfiguraodeconexocomobancodedados
$database_connection=$database_array['connections'][$database_array['default']];

//MtododoDoctrineusadoparaconfigurar
$config=Setup::createAnnotationMetadataConfiguration($path,$debug);

//RetornaumainstnciadoEntityManager
returnEntityManager::create($database_connection,$config);

/**
*Bootstraptheapplicationservices.
*
*@returnvoid
*/
publicfunctionboot()
{

$this>entityManager=self::getEntityManager();
}

/**
*Registertheapplicationservices.
*
*@returnvoid
*/
publicfunctionregister()
{

$this>app>singleton('Doctrine\ORM\EntityManagerInterface',function($app){

return$this>entityManager;

});
}

viewraw(https://gist.github.com/jaschweder/feae805d6c46de15adf3/raw/DoctrineServiceProvider.php)
DoctrineServiceProvider.php(https://gist.github.com/jaschweder/feae805d6c46de15adf3#file

doctrineserviceproviderphp)hostedwith

byGitHub(https://github.com)

Obs.: O cdigo est comentado e caso necessitem tirar alguma dvida, por favor escrevam nos
comentrios estarei atendendo o quanto antes for possvel.
Agora para testarmos vamos alterar o arquivo de configurao de conexo com banco de dados do
Laravel em config\database.php. Basicamente precisamos alterar duas coisas: mudar o valor da
posio default para sqlite e alterar o driver da posio sqlite na lista de conexes 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.
touchstorage/database.sqlite

Finalmente vamos rodar um comando do Doctrine para verificar se est tudo certo.
vendor\bin\doctrineorm:validateschema

Caso esteja tudo certo ser impresso no terminal uma mensagem dizendo que est tudo OK.
Bem pessoal, essa foi um introduo da integrao do Doctrine com o Laravel 5, aguardem os
prximos posts, segam-nos nas redes e at a prxima \o.

doctrine (http://blog.butecopensource.org/tag/doctrine/)
doctrine orm (http://blog.butecopensource.org/tag/doctrine-orm/)
Framework (http://blog.butecopensource.org/tag/framework/)
integrao (http://blog.butecopensource.org/tag/integracao/)
Laravel (http://blog.butecopensource.org/tag/laravel/)

5Comentrios

ButecoOpenSource

Compartilhar

Recommend

PHP (http://blog.butecopensource.org/tag/php/)

OrdenarporMelhoravaliado

Participedadiscusso...
ClientesClientes 7diasatrs

BoaTarde!timoPOST.
Umapergunta,possveltrabalharcomMultitenancySeparadoporbancocomDoctrine?
Casoafirmativo,voctemalgumartigosobreisso?
Obrigado

Responder Compartilhar

Entrar

JosBernardes 10diasatrs

Estouestudandoporcontaprpriabancodedadoseacheibeminteressanteamatria.
Estouacompanhando.
Valeu!!

Responder Compartilhar

MarceloWanderley 10diasatrs

AcheibeminteressanteoPOST.
Eutenhoumadvida.
Existeapossibilidadedeinserirdadosdeumasvezcontendorelacionamentoemumnico
objeto?
Algodestetipo.

Responder Compartilhar

JonathanAndrSchweder>MarceloWanderley 10diasatrs

Sim,porexemplo,$cidadee$estado,$cidadeteriaumatributochamado'estado',comos
devidosmtodosgeteset,nessecasovocfariaalgocomo:
$estadoRepository=$entityManager>getRepository('Estado')
$cidadeRepository=$entityManager>getRepository('Cidade')
$estado=$estadoRepository>find(1)//retornaoestadocom'id'=1
$cidade>setEstado($estado)//setaoestadonacidade
$cidadeRepository>save($cidade)//salvaemmemriaoobjeto
$entityManager>flush()//enviaasalteraesparaobanco(obrigatrio)
realmenteesseprimeiropostfoimaisparaconfiguraes,mostrareimaisdissonos
prximos,emresumo,nocdigousandoapenasoORM,vocsemprevaitrabalharapenas
comobjetos.

Responder Compartilhar

MarceloWanderley>JonathanAndrSchweder 10diasatrs

Legal.
Eseforassimcomoexemplo.
Umquestionriotemvariasperguntasecadaperguntatemvriosopesdo
tipo(radiobutton)..
Assimtambmtemcomoregistrarutilizandoumnicoobjeto?
NesteexemplotemosumarelaoOneToManyeManyToMany

Responder Compartilhar

TAMBMEMBUTECOOPENSOURCE

Laravel5docomeoaofim[parte3]

OQUEISSO?

UsandoaAPIdoGoogleAnalyticsno

Python

17comentrios3mesesatrs

VagnerLuzDoCarmoDequalquerforma,

sumadica,masoLaravelprocuraosnomes
emminsculoenopluralemingls(por

Construindoainterfacedelogindospotify
comPyGTKeCSS
4comentrios2mesesatrs

2comentrios2mesesatrs

SilasVasconcelosShowdebolacolega,

estareitestandohojemesmo!

CriandomduloPythonemC/C
1comentrio2mesesatrs

MarcosUmaboapedida,quesimplificabem

GermanoCorraMuitoobrigadoPedro!

Valeumesmo:D

oprocessoutilizarBoost.Python,pormos
temposdebuildaumentambastante,

Cupom de desconto nos livros da Casa do Cdigo (http://blog.butecopensource.org/cupom-de-desconto-nos-livros-dacasa-do-codigo/)

Fedup vai ser substitudo no Fedora 23 (http://blog.butecopensource.org/fedup-vai-ser-substituido-no-fedora-23-2/)

Pesquisar...

SORTEIO

Ganhe um e-Book da Casa do Cdigo

Participe (//blog.butecopensource.org/sorteio-de-um-ebook-da-casa-do-codigo/)
REDES SOCIAIS

Curtir

Compartilhar

522

Follow@ButecoOpenSource

Seguir

Seguir

153

284seguidores

ASSINE NOSSO RSS


Atom (http://blog.butecopensource.org/?feed=atom)
RDF/RSS 1.0 (http://blog.butecopensource.org/?feed=rdf)
RSS 0.92 (http://blog.butecopensource.org/?feed=rss)
RSS 2.0 (http://blog.butecopensource.org/?feed=rss2)

CATEGORIAS
Selecionar categoria

APOIO

(https://www.pagueveloz.com.br/Origem/blog.butecopensource.org/)

(http://novatec.com.br/?

utm_source=Blog&utm_medium=Banner&utm_campaign=ButecoOpenSource)

(http://www.aliexpress.com/store/product/Newest-Micro-M150-

Banana-Pi-same-as-Raspberry-pi-USB-WIFI-Adapter-for-Banana-Pi-use/302756_2020976445.html)

(http://www.filipeflop.com/?

utm_source=Blog&utm_medium=Banner&utm_campaign=ButecoOpenSource)
(http://www.lojamundi.com.br/embarcadosraspberry-cubieboard-beagleboneblack.html/?
utm_source=Blog&utm_medium=Banner&utm_campaign=ButecoOpenSource)
(http://www.rizer.com.br/?
utm_source=Blog&utm_medium=Banner&utm_campaign=ButecoOpenSource)

Anuncie aqui
(http://blog.butecopensource.com/anuncie-conosco/)

PARCEIROS

(http://www.embarcados.com.br/?

utm_source=butecopensource&utm_medium=banner&utm_campaign=Banner%20ButecopenSourc
e)

Seja um parceiro
(http://blog.butecopensource.com/anuncie-conosco/)

SIGA-NOS


(htt
ps://

ww

(htt w.yo

ps:// utub

(htt

plus. e.co

ps://
ww

goo m/c (htt

(htt gle.c han p:// (htt

w.fa ps:// om/ nel/ blog ps://


ceb twitt u/0/ UCu .but gith
ook. er.c +But fXN eco ub.c
com om/ eco YRU pen om/
/but bute Ope RPE sour Bute
eco cop nSo pF7 ce.o coO
pen ens urce uRDi rg/f pen
sour ourc Blog g5S eed/ Sour
ce)

TAGS

e)

Dw)

ce)

api (http://blog.butecopensource.org/tag/api/)

arduino (http://blog.butecopensource.org/tag/arduino/)

audio (http://blog.butecopensource.org/tag/audio/)
c (http://blog.butecopensource.org/tag/c/)

banana-pi (http://blog.butecopensource.org/tag/banana-pi/)

centos (http://blog.butecopensource.org/tag/centos/)

central-multimidia (http://blog.butecopensource.org/tag/central-multimidia/)
certificao (http://blog.butecopensource.org/tag/certificacao-2/)
desenvolvimento (http://blog.butecopensource.org/tag/desenvolvimento/)
eBook (http://blog.butecopensource.org/tag/ebook/)

email (http://blog.butecopensource.org/tag/email/)

Facebook (http://blog.butecopensource.org/tag/facebook/)

fedora (http://blog.butecopensource.org/tag/fedora/)

ferramenta (http://blog.butecopensource.org/tag/ferramenta/)

firefox (http://blog.butecopensource.org/tag/firefox/)

Framework (http://blog.butecopensource.org/tag/framework/)

games (http://blog.butecopensource.org/tag/games/)

GitHub (http://blog.butecopensource.org/tag/github/)
HTTP (http://blog.butecopensource.org/tag/http/)

gnome (http://blog.butecopensource.org/tag/gnome/)

IoT (http://blog.butecopensource.org/tag/iot/)

javascript (http://blog.butecopensource.org/tag/javascript/)
jquery (http://blog.butecopensource.org/tag/jquery/)

kernel (http://blog.butecopensource.org/tag/kernel/)

Laravel (http://blog.butecopensource.org/tag/laravel/)
linux (http://blog.butecopensource.org/tag/linux/)

jogos (http://blog.butecopensource.org/tag/jogos/)

laravel 5 (http://blog.butecopensource.org/tag/laravel-5/)

livros (http://blog.butecopensource.org/tag/livros/)

mozilla (http://blog.butecopensource.org/tag/mozilla/)

novatec (http://blog.butecopensource.org/tag/novatec/)

openSUSE (http://blog.butecopensource.org/tag/opensuse/)

PHP (http://blog.butecopensource.org/tag/php/)

programao (http://blog.butecopensource.org/tag/programacao/)
python (http://blog.butecopensource.org/tag/python/)
rust (http://blog.butecopensource.org/tag/rust/)

wine (http://blog.butecopensource.org/tag/wine/)

revista (http://blog.butecopensource.org/tag/revista/)

terminal (http://blog.butecopensource.org/tag/terminal/)

testes (http://blog.butecopensource.org/tag/testes/)
video (http://blog.butecopensource.org/tag/video/)

pypy (http://blog.butecopensource.org/tag/pypy/)

tirinha (http://blog.butecopensource.org/tag/tirinha/)
web (http://blog.butecopensource.org/tag/web/)
wordpress (http://blog.butecopensource.org/tag/wordpress/)

Buteco Open Source - 2015


Exceto quando indicado, o contedo deste site est licenciado sob a Creative Commons - Atribuio 4.0 Internacional
(http://creativecommons.org/licenses/by/4.0/).
Theme by Colorlib (http://colorlib.com/) Powered by WordPress (http://wordpress.org/)