Los indexadores permiten mejorar el rendimiento de un sistema Magento mediante el preprocesamiento de los datos más costosos de obtener. De modo que cuando el sistema necesite consumir esta información, ya se encontrara disponible en una estructura de datos óptima y eficiente.
Indexadores en Magento
Magento cuenta con varios indexadores nativos, pensados para procesar la información de clientes, productos, stock, etc. Y permitir su obtención y tratamiento de forma eficiente.
Desde el administrador, en la sección System > Tools > Index Management, podemos ver los indexadores disponibles y su estado:
Estos indexadores son capaces de detectar cambios en los datos de origen, para reindexar la información modificada y mantenerla actualizada.
Dependiendo de su configuración, los indexadores pueden funcionar de dos modos:
- Update on save: Reindexación sincrona en el momento de guardar cambios en los datos de origen (p.ej. al guardar datos de producto).
- Update by schedule: Reindexación asíncrona. Un proceso asíncrono comprueba si hay cambios pendientes de reindexar y lanza los procesos correspondientes.
Por otro lado, el CLI de Magento cuenta con una serie de comandos que pueden lanzarse a nivel de terminal para interactuar con los indexadores:
Listar los indexadores disponibles
bin/magento indexer:info
Lanzar indexadores
bin/magento indexer:reindex
bin/magento indexer:reindex <indexador>
Consultar estado de indexadores
bin/magento indexer:status
Marcar indexadores como inválidos
bin/magento indexer:reset
Consultar/modificar modo de los indexadores
bin/magento indexer:show-mode
bin/magento indexer:set-mode <modo>
Crear indexador personalizado
Magento incluye varios indexadores por defecto (productos, clientes, stock…), pero es posible crear indexadores personalizados para optimizar el coste de obtención de determinados datos del sistema.
A continuación se indican los pasos a dar para la creación de un indexador personalizado:
1. Definir indexador en indexer.xml
Crear un fichero <Modulo>/etc/indexer.xml y definir el nuevo indexador personalizado:
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Indexer/etc/indexer.xsd">
<indexer id="mi_indexador" view_id="mi_indexador" class="MiVendor\MiModulo\Model\Indexer" shared_index="mi_indexador">
<title translate="true">Título del indexador</title>
<description translate="true">Descripción del indexador</description>
</indexer>
</config>
2. Indicar tablas de origen de datos en mview.xml
Crear un fichero <Modulo>/etc/mview.xml y definir las tablas de base de datos de las que se obtienen los datos de origen para la indexación:
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Mview/etc/mview.xsd">
<view id="mi_indexador" class="MiVendor\MiModulo\Model\Indexer" group="indexer">
<subscriptions>
<table name="mi_tabla1" entity_column="entity_id" />
<table name="mi_tabla2" entity_column="entity_id" />
</subscriptions>
</view>
</config>
3. Crear clase con lógica de indexación
Crear el fichero <Modulo>/Model/Indexer.php implementando las interfaces IndexerInterface y MviewInterface, con la lógica de indexación de datos total y parcial:
<?php
declare(strict_types=1);
namespace MiVendor\MiModulo\Model;
use Magento\Framework\Indexer\ActionInterface as IndexerInterface;
use Magento\Framework\Mview\ActionInterface as MviewInterface;
class Indexer implements IndexerInterface, MviewInterface
{
public function execute($ids)
{
// TODO
}
public function executeFull()
{
// TODO
}
public function executeList(array $ids)
{
// TODO
}
public function executeRow($id)
{
// TODO
}
}
4. Todo listo!
Después de realizar los pasos anteriores, limpiar la caché y eliminar las clases generadas (directorio generated), tu indexador personalizado estará disponibles y podrás utilizarlo desde el CLI de Magento y desde el administrador.