---
title: Comandos de consola Symfony en modulos PrestaShop
section: trucos
slug: console-commands
description: "Como crear comandos CLI de Symfony para modulos PrestaShop 8/9: Command class, Input/Output, registro en services.yml y uso en crons, CI/CD y scripts de mantenimiento."
keywords: prestashop comandos consola symfony cli bin console command modulo cron
last_updated: 2024-12-01
source_url: "https://ayudaprestashop.es/trucos/console-commands"
---

# Comandos de consola Symfony en modulos PrestaShop

> Como crear comandos CLI de Symfony para modulos PrestaShop 8/9: Command class, Input/Output, registro en services.yml y uso en crons, CI/CD y scripts de mantenimiento.

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).

> **[TIP] 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
```


---

*Fuente: [https://ayudaprestashop.es/trucos/console-commands](https://ayudaprestashop.es/trucos/console-commands). Version Markdown generada automaticamente para consumo por LLMs.*
