jueves, 10 de octubre de 2013

Comandos de consola personalizados

Hay 3 acciones muy empleadas a la hora de desarrollar en Symfony.

1.- Actualizar la base de datos
2.- Actualizar el código en Desarrollo (local)
3.- Actualizar el código en Producción

Para que estas tareas sean mucho más sencillas Symfony viene con comandos de consola muy prácticos, que ejecutan procesos y nos facilitan la tarea. Pero siempre se tienen que ejecuta en forma secuencial, demandando memorizar el flujo y ejecutarlo cada vez que lo necesitemos.

Para esto vamos a crear 3 comandos de consola personalizados que ejecuten en forma secuencial las tareas a realizar.


1.- Actualizar la base de datos:
namespace Petramas\MainBundle\Command;

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class DatabaseUpdateCommand extends ContainerAwareCommand
{
    protected $route;
    
    public function __construct()
    {
        parent::__construct();
        $this->route = 'cd ' . __DIR__ . '/../../../../;php app/console ';
    }
    
    protected function configure()
    {
        $this->setName('database:update')
             ->setDescription('Delete and reconstruct database.')
        ;
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $output->write('Dropping database >> ');
        $output->writeln(shell_exec($this->route . 'doctrine:database:drop --force'));
        
        $output->write('Creating database >> ');
        $output->writeln(shell_exec($this->route . 'doctrine:database:create'));
        
        $output->write('Creating schema >> ');
        $output->writeln(shell_exec($this->route . 'doctrine:schema:create'));
        
        $output->write('Loading fixtures >> ');
        $output->writeln(shell_exec($this->route . 'doctrine:fixtures:load -n'));
        
        $output->writeln('Finished successfully.');
    }
}

2.- Actualizar el código en Desarrollo (local)
namespace Petramas\MainBundle\Command;

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class DevelopmentUpdateCommand extends ContainerAwareCommand
{
    protected $route;
    
    public function __construct()
    {
        parent::__construct();
        $this->route = 'cd ' . __DIR__ . '/../../../../;php app/console ';
    }
    
    protected function configure()
    {
        $this->setName('dev:up')
             ->setDescription('Development update.')
        ;
    }
    
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $output->write('Pulling from git repository >> ');
        $output->writeln(shell_exec('cd ' . __DIR__ . '/../../../../;git pull'));
        
        $output->write('Installing assets >> ');
        $output->writeln(shell_exec($this->route . 'assets:install web --symlink'));
        
        $output->write('Updating schema >> ');
        $output->writeln(shell_exec($this->route . 'doctrine:schema:update --force'));
        
        $output->write('Clearing cache >> ');
        $output->writeln(shell_exec($this->route . 'cache:clear'));
        
        $output->writeln('Finished successfully.');
    }
}

3.- Actualizar el código en Producción
namespace Petramas\MainBundle\Command;

use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class ProductionUpdateCommand extends ContainerAwareCommand
{
    protected $route;
    
    public function __construct()
    {
        parent::__construct();
        $this->route = 'cd ' . __DIR__ . '/../../../../;php app/console ';
    }
    
    protected function configure()
    {
        $this->setName('prod:up')
             ->setDescription('Move to production.')
            ;
    }
    
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $output->write('Pulling from git repository >> ');
        $output->writeln(shell_exec('cd ' . __DIR__ . '/../../../../;git pull'));
        
        $output->write('Installing assets >> ');
        $output->writeln(shell_exec($this->route . 'assets:install web --symlink'));
        
        $output->write('Updating schema >> ');
        $output->writeln(shell_exec($this->route . 'doctrine:schema:update --force'));
        
        $output->write('Dumping assets >> ');
        $output->writeln(shell_exec($this->route . 'assetic:dump web --env=prod'));
        
        $output->write('Clearing cache >> ');
        $output->writeln(shell_exec($this->route . 'cache:clear --env=prod'));
        
        $output->writeln('Finished successfully.');
    }
}