prestashop-api-module · git:20260604.8ae1905 · 2026-06-04 · sha256 841b9d492cbed24e
prestashop-api-module git:20260604.8ae1905A
Immutable. This exact content never changes and is served at /api/v1/blob/841b9d492cbed24e.
---
name: prestashop-api-module
description: Skill para crear y extender APIs en PrestaShop 8 (WebService legacy) y PrestaShop 9 (API Platform + WebService).
---
# PrestaShop API Module Skill
Este skill cubre los DOS sistemas de API disponibles segun la version de PrestaShop.
> **IMPORTANTE**: PS 8 y PS 9 usan sistemas de API completamente diferentes. No confundirlos.
## Matriz de Compatibilidad
| Sistema | PS 8 | PS 9 |
|---------|------|------|
| **WebService Legacy** (XML) | Unico disponible | Disponible (deprecated) |
| **API Platform** (REST/JSON) | NO existe | Nuevo sistema principal |
---
## 1. WebService Legacy (PS 8 + PS 9)
El sistema clasico basado en XML y ObjectModel. Funciona en ambas versiones.
### Hook de Registro
```php
public function install()
{
return parent::install() && $this->registerHook('addWebserviceResources');
}
```
### Exponer un Recurso
```php
public function hookAddWebserviceResources($params)
{
return [
'my_module_articles' => [
'description' => 'Access to module articles',
'class' => 'MyArticle', // Debe extender ObjectModel
'forbidden_method' => [], // Opcional: ['DELETE', 'PUT']
],
];
}
```
### ObjectModel Requerido
```php
class MyArticle extends ObjectModel
{
public $title;
public static $definition = [
'table' => 'my_article',
'primary' => 'id_my_article',
'fields' => [
'title' => [
'type' => self::TYPE_STRING,
'validate' => 'isGenericName',
'size' => 255,
'webservice' => true,
],
],
];
}
```
### Uso del WebService
1. Ir a **Parametros Avanzados > Webservice**.
2. Crear o editar una API Key.
3. El recurso `my_module_articles` aparecera en la lista de permisos.
4. Autenticacion via HTTP Basic Auth con la API Key como usuario.
```
GET https://mitienda.com/api/my_module_articles
Authorization: Basic BASE64(API_KEY:)
```
---
## 2. API Platform (SOLO PS 9)
PrestaShop 9 introduce un sistema nuevo basado en **API Platform** y **Symfony 6.4** con autenticacion **OAuth2**.
> **NO confundir** con el WebService legacy. Son sistemas independientes con rutas, autenticacion y formatos diferentes.
### Definir un API Resource
Crear configuracion en `src/Resources/api_platform/`:
```yaml
# src/Resources/api_platform/my_entity.yml
resources:
MyModule\ApiPlatform\Resource\MyEntity:
shortName: 'MyEntity'
description: 'Operations for my custom entity'
operations:
ApiPlatform\Metadata\Get:
provider: MyModule\ApiPlatform\State\MyEntityProvider
ApiPlatform\Metadata\GetCollection:
provider: MyModule\ApiPlatform\State\MyEntityCollectionProvider
ApiPlatform\Metadata\Post:
processor: MyModule\ApiPlatform\State\MyEntityProcessor
normalizationContext:
groups: ['my_entity:read']
denormalizationContext:
groups: ['my_entity:write']
```
### State Provider (lectura)
```php
declare(strict_types=1);
namespace MyModule\ApiPlatform\State;
use ApiPlatform\Metadata\Operation;
use ApiPlatform\State\ProviderInterface;
final class MyEntityProvider implements ProviderInterface
{
public function __construct(
private readonly \Db $db
) {
}
public function provide(Operation $operation, array $uriVariables = [], array $context = []): object|array|null
{
// Logica para obtener datos
$id = (int) ($uriVariables['id'] ?? 0);
// ...
}
}
```
### State Processor (escritura)
```php
declare(strict_types=1);
namespace MyModule\ApiPlatform\State;
use ApiPlatform\Metadata\Operation;
use ApiPlatform\State\ProcessorInterface;
final class MyEntityProcessor implements ProcessorInterface
{
public function process(mixed $data, Operation $operation, array $uriVariables = [], array $context = []): mixed
{
// Logica para guardar datos
return $data;
}
}
```
### Autenticacion OAuth2 (PS 9)
PS 9 usa OAuth2 con scopes. **NO** usa la pagina de WebService ni X-API-Key.
1. Configurar cliente OAuth2 en el admin de PS 9 (**Parametros Avanzados > Authorization Server**).
2. Obtener un token:
```
POST /admin-api/access_token
Content-Type: application/x-www-form-urlencoded
client_id=MY_CLIENT_ID&client_secret=MY_SECRET&grant_type=client_credentials&scope=my_scope
```
3. Usar el token:
```
GET /api/my-entities
Authorization: Bearer <access_token>
```
### Documentacion Interactiva
Disponible en `/api/docs` (Swagger UI) en instalaciones PS 9.
---
## 3. Reglas y Buenas Practicas
- **Strict Types**: Usar `declare(strict_types=1);` en todas las clases API.
- **Validadores**: Usar validadores reales de PrestaShop (`isGenericName`, `isCleanHtml`, etc.). NO existe `isString`.
- **Prefijos**: Usar nombre del modulo como prefijo en recursos para evitar colisiones.
- **Rendimiento**: El WebService XML puede ser lento con datasets grandes. En PS 9, preferir API Platform.
- **Campos multilenguaje**: En WebService, marcar con `'lang' => true` en la definicion del ObjectModel.