# Guía de migración: 9.8.4 → 9.8.5

La versión **9.8.5** mejora el manejo del método `run()` de los componentes y añade el nuevo pipe de plantilla `plain`.

---

## Resumen

### Añadido

- Los métodos `run()` de los componentes ahora pueden declararse sin parámetros.
- Nuevo pipe de plantilla `plain` para cadenas seguras para JSON sin codificación URL.
- Esta guía de migración.

### Modificado

- Los parámetros DTO de los métodos `run()` ahora se detectan por herencia de `ODTO` en lugar de por su namespace.
- Las firmas de los métodos `run()` de los componentes ahora se validan explícitamente.

### Eliminado

- No se ha eliminado nada.

---

## Firmas del método `run()` de los componentes

Los componentes pueden utilizar exactamente una de las siguientes firmas:

```php
public function run(): void
```

```php
public function run(ORequest $req): void
```

```php
public function run(MyDTO $dto): void
```

En el último caso, `MyDTO` debe extender `ODTO`.

La detección de los DTO se basa ahora en la herencia de `ODTO`, no en el namespace de la clase. Por tanto, las clases DTO pueden estar ubicadas en cualquier parte de la aplicación.

El resto de firmas no son válidas. Un método `run()` puede recibir como máximo un parámetro, que debe ser un `ORequest` no nullable o una clase que extienda `ODTO`.

---

## Nuevo pipe de plantilla `plain`

El nuevo pipe `plain` permite mostrar cadenas en plantillas JSON sin aplicar codificación URL:

```text
{{ user.name | plain }}
```

Por ejemplo:

```text
John Doe → "John Doe"
Dijo "hola" → "Dijo \"hola\""
```

El pipe utiliza una codificación segura para JSON, conserva los caracteres Unicode y las barras sin escapar, y escapa correctamente las comillas y otros caracteres especiales para JSON.

Los valores nulos se representan como `null`.

El pipe `string` existente continúa aplicando `urlencode()`.

---

## Impacto en proyectos existentes

Los componentes existentes que utilizan `run(ORequest $req)` o un DTO que extienda `ODTO` siguen siendo compatibles.

Los DTO ubicados en el namespace convencional `App\DTO` continúan funcionando sin cambios.

Las aplicaciones pueden utilizar ahora métodos `run()` sin parámetros cuando no sea necesario acceder a los datos de la solicitud.

---

## Compatibilidad con versiones anteriores

No es necesario realizar cambios en aplicaciones que utilicen parámetros `ORequest` o `ODTO` válidos.

Las aplicaciones que contengan firmas `run()` no admitidas deben actualizarlas a una de las formas compatibles.

---

## Acción requerida por el desarrollador

En aplicaciones típicas no se requiere ninguna acción. Revisa las firmas personalizadas de `run()` si utilizan parámetros sin tipo, nullable, union types, tipos no admitidos o múltiples parámetros.

---

## Notas

No se requieren cambios de configuración, base de datos ni CLI.
