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