---
title: Alternativas modernas a los overrides
section: overrides
slug: alternatives
description: "Alternativas modernas a los overrides de PrestaShop: hooks, decorators de servicios Symfony, event listeners, form modifiers y cuando usar cada patron."
keywords: prestashop alternativas overrides hooks decorators servicios symfony event listeners form modifiers
last_updated: 2024-12-01
source_url: "https://ayudaprestashop.es/overrides/alternatives"
---

# Alternativas modernas a los overrides

> Alternativas modernas a los overrides de PrestaShop: hooks, decorators de servicios Symfony, event listeners, form modifiers y cuando usar cada patron.

PrestaShop 8+ ofrece multiples alternativas modernas a los overrides de clases. Usar estas alternativas garantiza compatibilidad entre modulos, facilita las actualizaciones de PS y hace el codigo mas testeable y mantenible.

## Hooks — la alternativa principal

| Lo que antes hacian con override | Hook moderno equivalente |
| --- | --- |
| Override de Product::getProductProperties() | actionGetProductPropertiesAfter |
| Override de Order::save() | actionOrderStatusUpdate, actionValidateOrder |
| Override de Cart::getOrderTotal() | actionCartSave, actionGetExtraTotalValues |
| Override de AdminOrdersController::postProcess() | actionAdminOrdersControllerPostProcessBefore |
| Override de CustomerCore::getCustomersByEmail() | actionObjectCustomerAddBefore/After |
| Override de ProductController::initContent() | actionFrontControllerSetMedia, displayProductExtraContent |

## Form Builder Modifiers

*Modificar formularios sin override — forma moderna*

```php
<?php

// ANTES (con override):
// class Product extends ProductCore {
//     // ... añadir campo al formulario sobreescribiendo metodos
// }

// AHORA (sin override, usando hook):
public function hookActionProductFormBuilderModifier(array $params): void
{
    $formBuilder = $params['form_builder'];

    // Añadir campo al formulario de producto
    $formBuilder->add('my_field', \Symfony\Component\Form\Extension\Core\Type\TextType::class, [
        'label'    => 'Mi campo',
        'required' => false,
        'data'     => $this->getFieldValue((int) $params['id']),
    ]);
}

// Para el pedido:
public function hookActionOrderGridDefinitionModifier(array $params): void
{
    $definition = $params['definition'];
    // Modificar el grid de pedidos
}
```

## Service Decoration en Symfony

*config/services.yml — decorar un servicio del core*

```yaml
services:
  # Decorar el servicio de precios del core
  MyModule\Service\PriceCalculatorDecorator:
    decorates: 'prestashop.core.pricing.price_calculator'
    arguments:
      - '@MyModule\Service\PriceCalculatorDecorator.inner'
      - '@my_module.custom_discount_service'
```

*src/Service/PriceCalculatorDecorator.php*

```php
<?php

declare(strict_types=1);

namespace MyModule\Service;

use PrestaShop\PrestaShop\Core\Pricing\PriceCalculatorInterface;

class PriceCalculatorDecorator implements PriceCalculatorInterface
{
    private PriceCalculatorInterface $inner;
    private CustomDiscountService    $discountService;

    public function __construct(
        PriceCalculatorInterface $inner,
        CustomDiscountService $discountService
    ) {
        $this->inner           = $inner;
        $this->discountService = $discountService;
    }

    public function calculatePrice(/* ... parametros ... */): float
    {
        // Llamar al servicio original
        $price = $this->inner->calculatePrice(/* ... */);

        // Aplicar nuestra logica adicional
        return $this->discountService->applyCustomDiscount($price);
    }
}
```

## Tabla de decision rapida

| Necesidad | Alternativa recomendada |
| --- | --- |
| Añadir campo al formulario de producto | hookActionProductFormBuilderModifier |
| Modificar grid de pedidos en BO | hookActionOrderGridDefinitionModifier |
| Añadir logica al guardar un pedido | hookActionValidateOrder / hookActionOrderStatusUpdate |
| Modificar calculo de precio | hookActionGetProductPropertiesAfter o Service Decoration |
| Añadir tab al producto en FO | hookDisplayProductExtraContent |
| Modificar email de confirmacion | hookActionBuildMailLayoutVariables |
| Añadir validacion al checkout | hookActionCartSave / hookActionBeforeCartUpdateQty |
| Extender la API REST | hookAddWebserviceResources |
| Añadir pagina al BO | Symfony Controller + $this->tabs declaration |
| Modificar query SQL de listado BO | hookActionOrderGridQueryBuilderModifier |


---

*Fuente: [https://ayudaprestashop.es/overrides/alternatives](https://ayudaprestashop.es/overrides/alternatives). Version Markdown generada automaticamente para consumo por LLMs.*
