🔌 API Module + WebService Extension

Actualizado: 2026-04

#api_module — Nueva API PS 9

Demuestra como modificar y extender la nueva API de PrestaShop basada en API Platform v3. Requiere PS 9.0.0+.

ℹ️
Repositorio

github.com/PrestaShop/example-modules/tree/master/api_module

La nueva API usa API Platform con autenticacion OAuth2/JWT. Este modulo ensena como:

#Crear endpoints custom

Definir un recurso API con atributos PHP 8
php
<?php
// modules/api_module/src/ApiPlatform/Resources/MyResource.php

namespace PrestaShop\Module\ApiModule\ApiPlatform\Resources;

use ApiPlatform\Metadata\ApiResource;
use ApiPlatform\Metadata\Get;
use ApiPlatform\Metadata\GetCollection;
use ApiPlatform\Metadata\Post;
use PrestaShop\Module\ApiModule\ApiPlatform\Provider\MyResourceProvider;

#[ApiResource(
    operations: [
        new GetCollection(
            uriTemplate: '/my-resources',
            provider: MyResourceProvider::class,
            scopes: ['my_module_read']
        ),
        new Get(
            uriTemplate: '/my-resources/{myResourceId}',
            provider: MyResourceProvider::class,
            scopes: ['my_module_read']
        ),
        new Post(
            uriTemplate: '/my-resources',
            processor: MyResourceProcessor::class,
            scopes: ['my_module_write']
        ),
    ]
)]
class MyResource
{
    public int $myResourceId;
    public string $name;
    public string $description;
    public bool $active;
}

#Scopes y autorizacion

Registrar scopes en services.yml
yaml
# modules/api_module/config/services.yml
services:
  # Registrar scopes del modulo
  prestashop.module.api_module.scopes:
    class: PrestaShop\Module\ApiModule\Install\ApiScopeInstaller
    tags:
      - { name: 'prestashop.api.scope_installer' }

# Los scopes se registran en la BD:
# - my_module_read: Leer datos del modulo
# - my_module_write: Crear/modificar datos
Provider — obtener datos para la API
php
<?php
namespace PrestaShop\Module\ApiModule\ApiPlatform\Provider;

use ApiPlatform\Metadata\Operation;
use ApiPlatform\State\ProviderInterface;

class MyResourceProvider implements ProviderInterface
{
    public function __construct(
        private readonly MyResourceRepository $repository
    ) {}

    public function provide(
        Operation $operation,
        array $uriVariables = [],
        array $context = []
    ): object|array|null {
        if (isset($uriVariables['myResourceId'])) {
            return $this->repository->find($uriVariables['myResourceId']);
        }

        return $this->repository->findAll();
    }
}

#demowsextend — Extender WebService

Demuestra como anadir un recurso gestionado por ObjectModel al WebService legacy. Compatible desde PS 1.7.8.

ℹ️
Repositorio

github.com/PrestaShop/example-modules/tree/master/demowsextend

#ObjectModel como recurso REST

Hook addWebserviceResources — registrar recurso
php
<?php
// modules/demowsextend/demowsextend.php

public function hookAddWebserviceResources()
{
    return [
        'demo_ws_items' => [
            'description' => 'Demo WS Items',
            'class'       => 'DemoWsItem',  // ObjectModel
            'forbidden_method' => [],        // Permitir GET, POST, PUT, DELETE
        ],
    ];
}

// ObjectModel para el recurso
// modules/demowsextend/classes/DemoWsItem.php
class DemoWsItem extends ObjectModel
{
    public $name;
    public $description;
    public $active;

    public static $definition = [
        'table'   => 'demo_ws_item',
        'primary' => 'id_demo_ws_item',
        'fields'  => [
            'name'        => ['type' => self::TYPE_STRING, 'required' => true, 'size' => 255,
                              'ws' => true],
            'description' => ['type' => self::TYPE_HTML, 'ws' => true],
            'active'      => ['type' => self::TYPE_BOOL, 'ws' => true],
        ],
    ];

    // El campo 'ws' => true hace el campo visible en la API
    // Omitir 'ws' o poner 'ws' => false oculta el campo

    // Campos virtuales para WebService:
    protected $webserviceParameters = [
        'objectNodeName'  => 'demo_ws_item',
        'objectsNodeName' => 'demo_ws_items',
        'fields' => [
            'formatted_name' => [
                'getter' => 'getFormattedName',
                'ws_modifier' => true, // Campo virtual de solo lectura
            ],
        ],
    ];

    public function getFormattedName(): string
    {
        return strtoupper($this->name);
    }
}

#API Platform vs WebService Legacy

AspectoWebService (legacy)API Platform (PS 9+)
AutenticacionAPI Key + Basic AuthOAuth2 + JWT
FormatoXML (+ JSON parcial)JSON-LD, JSON, HAL
DocumentacionManualOpenAPI auto-generada
RoutingHook addWebserviceResourcesAtributos PHP 8 #[ApiResource]
Data layerObjectModel obligatorioDoctrine, CQRS, custom providers
VersioningNoSi, via URI o header
Estado en PS 9.xFuncional pero legacyRecomendado para nuevos desarrollos
DisponibilidadPS 1.5+PS 9.0+ (API Platform v3)
⚠️
Recomendacion

Para nuevos modulos PS 9+, usa la API Platform. Para modulos retro-compatibles con PS 1.7/8.x, el WebService legacy sigue siendo la opcion segura.

Descargar en Markdown Pensado para pegar en ChatGPT, Claude u otra IA. Incluye solo el contenido de esta pagina.