Skip to content

9.2.0 - Nuevo sistema global de componentes

Choose a tag to compare

@osumionline osumionline released this 14 Oct 11:26
· 156 commits to main since this release

¡Más breaking changes! ¡Componentes everywhere!

A partir de esta versión, el framework pasa a usar un sistema unificado de componentes en general. Hasta ahora los componentes eran pequeñas piezas de código reutilizables, mientras que las acciones eran clases con entidad propia. Ahora las acciones desaparecen en favor de componentes también.

Esto hace que desaparezcan las clases OAction y OTemplate y que la sintaxis tanto de componentes como de acciones pase a ser la misma, siendo estos los encargados de renderizar su propio contenido.

Cambios más notables:

Variables en componentes

Los componentes pasan a usar el mismo sistema de variables pasadas a templates que tenían las acciones. Esto es, deja de haber una variable general llamada $values en favor de variables individuales con su propio nombre:

// Antes

// Clase del componente: "HolaComponent.php"
class HolaComponent {}
// Template del componente: "HolaTemplate.php"
Hola <?php echo $values['nombre'] ?>

// Uso
$hola = new HolaComponent(['nombre' => 'Iñigo']);

// Ahora
// Clase del componente: "HolaComponent.php"
class HolaComponent {
  public string $nombre = ''; // Se inicializa el valor en el propio componente
}
// Template del componente: "HolaTemplate.html" // Deja de ser necesario usar templates .php
Hola {{nombre}}

// Uso
$hola = new HolaComponent(['nombre' => 'Iñigo']);
$hola = new HolaComponent();
$hola->nombre = 'Iñigo'; // Deja de ser necesario usar el método setValue ya que ahora se puede acceder directamente a las propiedades

Los templates dejan de ser estrictamente archivos .php y se pueden usar archivos .html, .json, .xml o (como antes) .php. En el caso de no usar un archivo php, las variables se interpolan en el template usando la sintaxis de {{nombre_variable}}. En caso de usar una template php, se pueden usar las variables por su propio nombre sin tener que recurrir a una variable $values general.

Adios acciones, hola componentes

Las acciones desaparecen y pasan a ser también componentes, aunque su funcionamiento ha variado poco. El único cambio notable es que ahora pasan a heredar de la clase OComponent en lugar de usar OAction, y en caso de usar un constructor en la clase (por ejemplo para inyectar servicios), es necesario llamar al constructor de su clase padre para que lo inicialice.

// Antes

class IndexAction extends OAction {
  private ?WebService $ws = null;

  public function __construct() {
    $this->ws = inject(WebService::class);
 }

  public function run(ORequest $req) {
    // Código de la acción
  }
}

// Ahora

class IndexComponent extends OComponent {
  private ?WebService $ws = null;

  public function __construct() {
    parent::__construct();
    $this->ws = inject(WebService::class);
 }

  public function run(ORequest $req) {
    // Código de la acción
  }
}

Desaparecen los tipos

Antes al crear las rutas era necesario indicar el tipo de respuesta (html, json...). Ahora el tipo es deducido por la extensión del template por lo que desaparece la función group de ORoute:

// Antes

ORoute::group('/api', 'json', function() {
  ORoute::post('/login', LoginAction::class);
  ORoute::get('/get-users', LoginAction::class, [LoginFilter::class);
});

// Ahora

ORoute::prefix('/api', function() {
  ORoute::post('/login', LoginComoponent::class);
  ORoute::get('/get-users', GetUsersComponent::class, [LoginFilter::class);
});

Layout como componente

A partir de esta versión, el layout pasa a ser también un componente en lugar de ser un archivo genérico. Se ha añadido una nueva función llamada layout en ORoute para poder agrupar rutas usando un mismo layout:

// Agrupar por layout
ORoute::layout(DefaultLayoutComponent::class, function() {
  ORoute::get('/', IndexComponent::class);
  ORoute::get('/user/:id', UserComponent::class);
});

// Agrupar por prefijo y layout
ORoute::group('/user', UserLayoutComponent::class, function() {
  ORoute::get('/:id', UserComponent::class);
  ORoute::get('/:id/orders', UserOrdersComponent::class);
});

Con estos cambios espero estabilizar la versión 9 del framework y pasar a implementar nuevas funcionalidades en lugar de andar rompiendo cosas con cada actualización :)