💻

Comandos de consola Symfony en modulos PrestaShop

Actualizado: 2024-12-01

Los comandos de consola Symfony permiten ejecutar logica de negocio del modulo desde la linea de comandos. Son ideales para importaciones masivas, sincronizacion de datos, mantenimiento y tareas programadas (cron).

💡
Disponible desde PS 1.7.6+

Los comandos Symfony estan disponibles en PrestaShop 1.7.6 en adelante mediante php bin/console. En PS 1.6 no existe esta funcionalidad.

#Crear la clase Command

src/Command/SyncProductsCommand.php
php
<?php

declare(strict_types=1);

namespace MyModule\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputArgument;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;

class SyncProductsCommand extends Command
{
    // Nombre del comando: modulo:accion
    protected static $defaultName = 'mymodule:sync-products';

    private MyProductService $productService;

    public function __construct(MyProductService $productService)
    {
        parent::__construct();
        $this->productService = $productService;
    }

    protected function configure(): void
    {
        $this
            ->setDescription('Sincroniza productos con el ERP externo')
            ->setHelp('Ejecuta la sincronizacion de productos desde la API del ERP.')
            // Argumentos obligatorios
            ->addArgument(
                'source',
                InputArgument::OPTIONAL,
                'Fuente de datos (erp|csv)',
                'erp'              // valor por defecto
            )
            // Opciones opcionales
            ->addOption(
                'limit',           // nombre
                'l',               // alias corto
                InputOption::VALUE_OPTIONAL,
                'Numero maximo de productos a sincronizar',
                100                // default
            )
            ->addOption(
                'dry-run',
                null,
                InputOption::VALUE_NONE,
                'Simular sin guardar cambios'
            );
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $io     = new SymfonyStyle($input, $output);
        $source = $input->getArgument('source');
        $limit  = (int) $input->getOption('limit');
        $dryRun = (bool) $input->getOption('dry-run');

        $io->title('Sincronizacion de productos — MyModule');
        $io->writeln("Fuente: <info>{$source}</info> | Limite: <info>{$limit}</info>");

        if ($dryRun) {
            $io->warning('Modo DRY RUN — no se guardaran cambios');
        }

        try {
            $io->progressStart($limit);

            $products = $this->productService->fetchFromSource($source, $limit);

            foreach ($products as $product) {
                if (!$dryRun) {
                    $this->productService->sync($product);
                }
                $io->progressAdvance();
            }

            $io->progressFinish();
            $io->success("Sincronizacion completada: " . count($products) . " productos.");

            return Command::SUCCESS;
        } catch (\Exception $e) {
            $io->error('Error: ' . $e->getMessage());
            return Command::FAILURE;
        }
    }
}

#Registrar en services.yml

config/services.yml — registro del comando
yaml
services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: true

  MyModule\Command\SyncProductsCommand:
    tags:
      - { name: console.command }

#Ejecutar y usar en cron

Ejecutar comandos desde CLI
bash
# Listar todos los comandos disponibles
php bin/console list mymodule

# Ejecutar el comando
php bin/console mymodule:sync-products

# Con argumentos y opciones
php bin/console mymodule:sync-products csv --limit=50

# Modo dry-run
php bin/console mymodule:sync-products --dry-run

# Con verbose para debug
php bin/console mymodule:sync-products -v

# --- CRONTAB (ejecutar cada hora) ---
# crontab -e
0 * * * * /usr/bin/php /var/www/html/bin/console mymodule:sync-products >> /var/log/mymodule-sync.log 2>&1

# Cada dia a las 2 AM
0 2 * * * /usr/bin/php /var/www/html/bin/console mymodule:sync-products --limit=1000 >> /var/log/mymodule.log 2>&1
Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.