Back-End

9 set, 2016

Projeto PHP OO e engenharia reversa com Doctrine

1514 visualizações
Publicidade

Sabe aquele tempo que você perdia criando as entidades, uma por uma? Pois bem, seus problemas acabaram! Brincadeira à parte, vamos a um exemplo simples de exportação de um mapeamento na base de dados e transformar em entidades. Talvez haja a necessidade, para adaptar às nossas necessidades, de modificar coisas pontuais nas annotations criadas.

Abaixo, temos nosso modelo de exemplo, uma entidade Usuário e seus endereços. Para modos de curiosidade, modelei usando o Mysql Workbench.

imagem01

Agora, vem o código e exportação do mapeamento para classes PHP. Vejamos o código abaixo, devidamente comentado:

<?php
//Importar o autoload
require_once "vendor/autoload.php";

use Doctrine\ORM\Tools\DisconnectedClassMetadataFactory;
use Doctrine\ORM\Tools\Export\ClassMetadataExporter;
use Doctrine\ORM\Tools\EntityGenerator;
use Doctrine\ORM\Mapping\Driver\DatabaseDriver;

//Setando a pasta onde ficará o código fonte de nossa aplicação
$config = \Doctrine\ORM\Tools\Setup::createAnnotationMetadataConfiguration(array(__DIR__."/src"), true);

//Dados do Banco de dados
$connection = array(
   'dbname' => 'imasters',
   'user' => 'root',
   'password' => 'root',
   'host' => '127.0.0.1',
   'driver' => 'pdo_mysql',
);
//Criando o EntityManager (Gerenciador de entidade)
$entityManager = \Doctrine\ORM\EntityManager::create($connection, $config);

//Lendo o banco de dados, criando o driver
$driver = new DatabaseDriver($entityManager->getConnection()->getSchemaManager());
//Setando o Namespace ao driver
$driver->setNamespace('App\\Entity\\');
$entityManager->getConfiguration()->setMetadataDriverImpl($driver);

//Preparando para realizar o mapeamento
$classMetaData = new DisconnectedClassMetadataFactory();
$classMetaData->setEntityManager($entityManager);
$metadata = $classMetaData->getAllMetadata();

//Criamos o exporter, informando que a classe exportada conterá annotations, poderia ser XML, YAML, YML ou PHP
// E setamos a pasta do nosso projeto onde ficarão as entidades conforme o NameSpace que setamos anteriormente
$exporter = (new ClassMetadataExporter())->getExporter('annotation', 'src/');
//Criamos o gerador de entidades colocando-o no exporter, jutamento com os metadados vindos do mapeamento.
$exporter->setEntityGenerator(new EntityGenerator());
$exporter->setMetadata($metadata);
//Exportamos!
$exporter->export();

Vamos executar este arquivo. Pode ser no browser ou utilizando o terminal, na pasta do projeto escrevendo “php export.php”. Após a execução, caso não haja problemas com permissão de pasta, nossas entidades estão lá, veja:

imagem02-

Grande abraço e até a próxima!