Iniciar un proyecto Symfony en Heroku

Guía para iniciar una aplicación Symfony 2 en Heroku, además de implementar un add-on para una base de datos Mysql

Para instalar un proyecto Symfony 2 en Heroku primero has de tener instalado el proyecto en tu servidor local (además de una cuenta en Heroku). En este caso puedes emplear una instalación Symfony Standard Edition.

Accediendo al directorio donde está instalado Symfony, iniciamos el repositorio git y hacemos el primer commit:

git init
git add .
git commit -m "Initial import"

Para implementar el proyecto en Heroku, primero tienes que crear el Procfile, puedes hacerlo con el código:

echo "web: bin/heroku-php-apache2 web/" > Procfile ​
git add .
git commit -m "Procfile for Apache and PHP"

Crear la nueva aplicación en Heroku

Para crear una aplicación en Heroku tan sólo tienes que escribir el comando:

heroku create

Si no especificas el entorno a usar (dev, prod), Symfony usará por defecto el entorno de desarrollo dev en los comandos de consola y al ejecutarse. Esto crearía problemas porque en el entorno de desarrollo, Symfony usa el bundle SensioGeneratorBundle para ciertas tareas, pero ese bundle no se instala al hacer push, Composer no instala esos paquetes cuando se hace push en Heroku.

Por ello hay que usar el entorno de producción prod, que se puede hacer fácilmente poniendo en la consola:

heroku config:set SYMFONY_ENV=prod

Pushing a Heroku

Es el momento de implementar tu aplicación en Heroku:

git push heroku master

Ahora ya puedes acceder a tu aplicación online, puedes hacerlo mediante el código:

heroku open

Utilizar una base de datos Mysql en Heroku

Para utilizar una base de datos Mysql en Heroku es necesario utilizar ClearDB, que se instala con un código básico:

heroku addons:add cleardb:ignite

¿Pero cómo configuramos los parámetros para que reconozca la base de datos? Aquí encontré un método sencillo, estos son los pasos:

El apartado imports del archivo app/config/config.yml ha de quedar:

imports:
    - { resource: security.yml }
    - { resource: services.yml }

El apartado imports del archivo _app/config/configdev.yml:

imports:
    - { resource: parameters.yml }
    - { resource: config.yml }

El apartado imports del archivo _app/config/configprod.yml:

imports:
    - { resource: parameters_production.php }
    - { resource: config.yml }

Con esto hemos añadido un nuevo archivo PHP para el entorno de producción donde añadiremos los datos de la base de datos. Procedemos a crear _parametersproduction.php en app/config, y su contenido es el siguiente:

<?php

$db = parse_url(getenv('CLEARDB_DATABASE_URL'));

$container->setParameter('database_driver', 'pdo_mysql');
$container->setParameter('database_host', $db['host']);
$container->setParameter('database_port', $db['port']);
$container->setParameter('database_name', substr($db["path"], 1));
$container->setParameter('database_user', $db['user']);
$container->setParameter('database_password', $db['pass']);
$container->setParameter('secret', getenv('SECRET'));
$container->setParameter('locale', 'es');
$container->setParameter('mailer_transport', null);
$container->setParameter('mailer_host', null);
$container->setParameter('mailer_user', null);
$container->setParameter('mailer_password', null);

El apartado 'secret', debe llevar el token que creas con heroku:

heroku config:set SECRET='Codigosecreto'

Puedes comprobar que se ha generado escribiendo:

heroku config

Ahora ya detectará la base de datos, puedes crear el esquema inicial de tu tabla con el código:

heroku run php app/console doctrine:schema:create

Añadir extensiones PHP

Algunas extensiones importantes de PHP no se incluyen por defecto y hay que activarlas. Un ejemplo es mbstring, que es necesaria para el funcionamiento de bundles como FOSUserBundle. Aquí está el listado de las extensiones PHP que pueden ser activadas a través de composer:

  • BCMath (bcmath)
  • Calendar (calendar)
  • Exif (exif)
  • FTP (ftp)
  • GD (gd; with PNG, JPEG and FreeType support)
  • gettext (gettext)
  • intl (intl)
  • mbstring (mbstring)
  • MySQL (mysql; note that this extension is deprecated since PHP 5.5, please migrate to MySQLi or PDO)
  • PCNTL (pcntl)
  • Shmop (shmop)
  • SOAP (soap)
  • SQLite3 (sqlite3)
  • SQLite (PDO) (pdo_sqlite)
  • XMLRPC (xmlrpc)
  • XSL (xsl)

En este caso para activar mbstring tan sólo tenemos que añadirlo en composer.json:

"require": {
    ...
    "ext-mbstring": "*",
    ...
}

Y hacer un composer update.