Jump to content

[SOLUCIONADO] Componente Router de Symfony y el contexto de ejecución


Manuel_GT

Recommended Posts

Hola!

Pues ya la he liado otra vez. Uno de mis módulos envía mensajes a los almacenes al final del proceso de compra y se me ha ocurrido que podría enviarlos de forma asíncrona para evitar esperas o posibles timeouts (estos correos se lanzan justo después del pago). He creado una tabla en la bbdd como cola de mensajes y he generado un proceso Command de Symfony que ejecuto mediante el cron de la máquina. Todo funciona correctamente excepto un detalle: el email lleva en el cuerpo del mensaje una ruta que genero con el componente Router de Symfony y se genera de forma incorrecta. En particular si llamo al método desde un controlador la ruta se genera correctamente. Algo como:

https://midominio/mitienda/admin/index.php/modules/warehouses/agreement?hash=1234567

Pero si llama el método el cron la url que resulta es:

https://midominio/modules/warehouses/agreement?hash=1234567

Es decir pierdo tanto el directorio de mi tienda como el de el administrador.

Entiendo que el problema es de contexto. La ejecución desde el cron es mediante la consola (bin/console)

He probado a generar un contexto con

$legacyContext = Context::getContext();

pero no parece que sea suficiente.

Mi pregunta al foro es si alguien sabe como puedo inicializar/inyectar el contexto correcto para que Router funcione como si de un controlador se tratase.

De lo contrario me veo poniendo la ruta a pelo en el email, cosa que no quiero hacer.

 

 

Link to comment
Share on other sites

Basta con que publique para ver algo de luz en el asunto. 🤦‍♂️

Al parecer el componente Router recibe un parámetro RequestContext. Si se ejecuta el proceso desde consola este objeto viene inicializado erroneamente con lo mínimo. La solución por ahora ha sido, antes de generar la ruta, comprobar si este objeto está bien inicializado y si no es así, completarlo.

       // El siguiente link no se genera bien en ejecuciones desde CONSOLE y hay que inicializar el Router.
        $requestContext = $this->router->getContext();
        if (empty($requestContext->getBaseUrl())){
            $this->logger->Log("sendAgreementNotification -> Contexto vacio. llenamos el contexto",'DEVEL');
            // TODO: Quitar lo puesto a pelo y reemplazarlo por variables....
            $requestContext->setBaseUrl('/mitienda/admin/index.php');
            $requestContext->setHost('midominio');
            $this->router->setContext($requestContext);
        }
...

Con eso ya puedo llamar al Router para generar las urls completas correctamente. Ahora solo me falta que esa inicialización se haga mediante variables y no con cadenas de texto...

PD: ¿Hay alguna variable de entorno de donde se puede sacar el path del administrador?? No encuentro este dato ni en la base de datos ni en la carpeta del proyecto...

 

Link to comment
Share on other sites

Normalmente en estos casos se recomienda ejecutar desde un front controller

https://devdocs.prestashop-project.org/8/modules/concepts/controllers/front-controllers/#using-a-front-controller-as-a-cron-task

O  bien, que yo creo que estos casos sería mejor práctica, añadiendo directamente la lógica de negocio en el execute de la clase del extends Command

 

Link to comment
Share on other sites

Hola @ventura gracias por el aporte

Sin entrar en detalles, este proceso envuelve a los empleados de la tienda y al administrador por lo que no es de Front. Por otro lado, la clase que extiende el Command efectivamente lanza el proceso pero este proceso requiere de una serie de servicios ya programados usando Symfony que hacen distintas tareas en el módulo en la parte de administración. En pocas palabras, lo que hace el cron también se puede hacer de forma manual en el BO de la tienda. Por eso el Command se limita a llamar a los servicios del container Symfony.

En cualquier caso ya lo he terminado y funciona perfectamente.

¡Gracias!

Edited by Manuel_GT (see edit history)
Link to comment
Share on other sites

  • Manuel_GT changed the title to [SOLUCIONADO] Componente Router de Symfony y el contexto de ejecución
1 hour ago, Manuel_GT said:

Hola @ventura gracias por el aporte

Sin entrar en detalles, este proceso envuelve a los empleados de la tienda y al administrador por lo que no es de Front. Por otro lado, la clase que extiende el Command efectivamente lanza el proceso pero este proceso requiere de una serie de servicios ya programados usando Symfony que hacen distintas tareas en el módulo en la parte de administración. En pocas palabras, lo que hace el cron también se puede hacer de forma manual en el BO de la tienda. Por eso el Command se limita a llamar a los servicios del container Symfony.

En cualquier caso ya lo he terminado y funciona perfectamente.

¡Gracias!

 

 

En cualquier caso compañero, no entiendo lo del router para iniciar un controller del admin desde el extends Command . Por otro lado no tiene nada que ver que el proceso aplique sobre registros de empleados para que se ejecute desde un controller de frontend,

Un saludo

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...