erknrio
11/2/2016 - 4:38 PM

Instalar y configurar Doctrine sin Symfony: Mapeo inverso, etc.

Instalar y configurar Doctrine sin Symfony: Mapeo inverso, etc.

Introducción

A continuación verás los pasos necesario para instalar, configurar y hacer ingeniería inversa para obtener los datos de una base de datos existene.

Entorno de pruebas

Debian 8.6 PHP 5.6. MySQL 5.7. Composer 1.2.1 Doctrine 2.4

Instalación

Para la instalación de los elementos necesarios vamos a usar composer. Vamos a usar yaml para generar el esquema de la base de datos que vamos a necesitar. Creamos una fichero llamado composer.json en la raíz de nuestro proyecto.

"require": {
    "doctrine/orm": "2.4.*",
    "symfony/yaml": "2.*"
},
"autoload": {
    "psr-0": {"": "config/yml/"},
    "psr-0": {"": "config/generated-entities/"}
}

En el campo require incluímos symfony/yaml para poder generar el esquema de la base de datos como un fichero .yml, podríamos generarlo como .xml o php anotado.

En el autoload agregamos las carpetas que usaremos para albergar nuestros ficheros de mapeo y entidades.

Una vez tengamos el fichero creado ejecutamos un composer install para que instale todos los elementos necesarios.

Configurando Doctrine

Vamos a necesitar 2 ficheros:

  • cli-config.php
  • bootstrap.php

A continuación puedes ver los dos ficheros completos:

<?php
// cli-config.php
use Doctrine\ORM\Tools\Console\ConsoleRunner;

// replace with file to your own project bootstrap
require_once 'doctrine/bootstrap.php';

return ConsoleRunner::createHelperSet($entityManager);

<?php
// bootstrap.php
// Include Composer Autoload (relative to project root).
$curr_dir = dirname(__FILE__);
require_once $curr_dir . "/../vendor/autoload.php";

use Doctrine\ORM\Tools\Setup;
use Doctrine\ORM\EntityManager;

$paths = array($curr_dir . "/../config/yml");
$isDevMode = false;

require_once dirname(__FILE__) . '/../models/settings.php';

$connectionOptions = array(
    'driver'   => 'pdo_mysql',
    'host'     => $db_host,
    'port'     => $db_port,
    'user'     => $db_user,
    'password' => $db_pass,
    'dbname'   => $db_name,
    'charset'  => 'UTF8',
    'mapping_types'   => array ('enum' => 'string') 
);

$config = Setup::createYAMLMetadataConfiguration($paths, $isDevMode);
$entityManager = EntityManager::create($connectionOptions, $config);

$platform = $entityManager->getConnection()->getDatabasePlatform();
//ojo aqui: al no existir enum como un tipo de dato en doctrine, lo enlazamos a mano
$platform->registerDoctrineTypeMapping('enum', 'string');

?>

Ahora creamos las carpetas necesarias dentro de la raíz de nuestro proyecto:

  • mkdir -p config/yml
  • mkdir doctrine

Mapeo inverso (reverse engineering)

Como vamos a usar yml, convertimos la Base de Datos (bd) a un esquema .yml:

vendor/bin/doctrine orm:convert-mapping --from-database yml config/yml/

Este comando nos generará un fichero .dcm.yml por cada tabla de la base de datos dentro de config/yml. Tiene ciertas limitaciones en tablas relacionales, sobre todo de muchos a muchos y no funciona del todo correcto cuando enlazamos a otras base de datos. Puede requerir configuración manual en estos casos.

Generando entidades

Por cada tabla ahora vamos a generar una clase que emplearemos para interactuar con la base de datos, el famoso CRUD.

vendor/bin/doctrine orm:generate-entities config/generated-entities/

Esto nos debió generar las entidades dentro de config/generated-entities.

Realizar nuestra primera consulta

En construcción.

Ejemplo documentación oficial

Documentación