---
title: API Module + WebService Extension
section: sample-modules
slug: api-webservice
description: Modulos de ejemplo api_module y demowsextend. Crear endpoints API Platform v3 con OAuth2/JWT y extender el WebService legacy con ObjectModel.
last_updated: 2026-04
source_url: "https://ayudaprestashop.es/sample-modules/api-webservice"
---

# API Module + WebService Extension

> Modulos de ejemplo api_module y demowsextend. Crear endpoints API Platform v3 con OAuth2/JWT y extender el WebService legacy con ObjectModel.

## 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+.

> **[I] 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.

> **[I] 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

| Aspecto | WebService (legacy) | API Platform (PS 9+) |
| --- | --- | --- |
| Autenticacion | API Key + Basic Auth | OAuth2 + JWT |
| Formato | XML (+ JSON parcial) | JSON-LD, JSON, HAL |
| Documentacion | Manual | OpenAPI auto-generada |
| Routing | Hook addWebserviceResources | Atributos PHP 8 #[ApiResource] |
| Data layer | ObjectModel obligatorio | Doctrine, CQRS, custom providers |
| Versioning | No | Si, via URI o header |
| Estado en PS 9.x | Funcional pero legacy | Recomendado para nuevos desarrollos |
| Disponibilidad | PS 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.


---

*Fuente: [https://ayudaprestashop.es/sample-modules/api-webservice](https://ayudaprestashop.es/sample-modules/api-webservice). Version Markdown generada automaticamente para consumo por LLMs.*
