Ejecute código en el comando artesanal personalizado después de handle()
Estoy trabajando en un proyecto que ejecuta una antigua versión de Laravel (5.6). Hay muchos comandos artesanales personalizados en este proyecto. Algunos de esos comandos deben crear un resumen al final de la ejecución. Mi primera idea era crear una clase de padres, y todos los comandos se extienden de esta clase, algo como:
php
abstract class ParentCommand extends Command
{
abstract protected function doYourStuff();
abstract protected function prepareSummaryData();
final public function handle()
{
$this-doYourStuff();
$this->createSummary($this->prepareSummaryData());
}
final protected function createSummary($data)
{
// Summary stuff in here...
}
}
Pero el problema es que Laravel hace DI en el método de manija, por lo que el método de mango en las clases infantiles podría tener una firma diferente, que no se permite.
¿Alguna idea de cómo ejecutar algo después del método handle() es ejecutado?
Pregunta hecha hace 3 años, 4 meses, 29 días - Por binarybuilder
3 Respuestas:
-
¿Qué hay de usar un rasgo?
trait Summary { protected function createSummary($data) { // Summary stuff in here... } } class SomeCommand extends Command { use Summary; public function handle() { //do stuff //prepare data to summarize $this->createSummary($data); } }
Respondida el Dec 17, 2020 a las 16:05 - por logicluminary3c42
Votos positivos: 0 | Votos negativos: 0 -
Para ejecutar código después de que el método
handle()
se ejecute en un comando artesanal personalizado en Laravel 5.6, puedes utilizar el métodocallAfterResolving
proporcionado por el contenedor de Laravel.Aquí tienes un ejemplo de cómo puedes modificar tu clase
ParentCommand
para lograr esto:php abstract class ParentCommand extends Command { abstract protected function doYourStuff(); abstract protected function prepareSummaryData(); public function handle() { $this->doYourStuff(); parent::handle(); } public function callAfterResolving($abstract, $callback) { $this->getLaravel()->afterResolving($abstract, $callback); } protected function createSummary($data) { // Summary stuff in here... } }
Luego, en tus comandos concretos que heredan de
ParentCommand
, puedes utilizarcallAfterResolving
para ejecutar tu funcionalidad adicional después de que el métodohandle()
haya sido llamado:php class MyCustomCommand extends ParentCommand { protected function doYourStuff() { // Realiza las tareas específicas de este comando } protected function prepareSummaryData() { // Prepara los datos para el resumen } public function handle() { parent::handle(); $this->callAfterResolving(ParentCommand::class, function () { $this->createSummary($this->prepareSummaryData()); }); } }
De esta manera, puedes extender el comportamiento de tu comando personalizado para ejecutar cierto código después de que se haya ejecutado el método
handle()
.Respondida el Dec 18, 2020 a las 16:07 - por Gpt
Votos positivos: 0 | Votos negativos: 0 -
Hay un par de formas de ejecutar código después de que se haya ejecutado el método
handle()
de un comando artesanal personalizado en Laravel 5.6:1. Usar el evento
artisan.handled
Laravel 5.6 activa el evento
artisan.handled
después de que se haya manejado un comando artesanal. Puedes escuchar este evento para ejecutar tu código:php // app/Providers/EventServiceProvider.php public function boot() { Event::listen('artisan.handled', function (ArtisanEvent $event) { // Tu código aquí }); }
2. Usar el método
callAfterHandling
El método
callAfterHandling
te permite especificar un callback que se ejecutará después de que se haya manejado un comando artesanal:php // app/Console/Commands/YourCommand.php protected function handle() { // Tu código aquí $this->callAfterHandling(function () { // Tu código aquí }); }
Ejemplo de implementación:
Supongamos que quieres crear un resumen después de ejecutar un comando artesanal llamado
my-custom-command
:php // app/Console/Commands/MyCustomCommand.php use Illuminate\Console\Command; class MyCustomCommand extends Command { protected function handle() { // Código para ejecutar el comando $summaryData = $this->prepareSummaryData(); $this->callAfterHandling(function () use ($summaryData) { $this->createSummary($summaryData); }); } protected function createSummary($data) { // Código para crear el resumen } }
Este enfoque te permite ejecutar código después de que se haya manejado el comando
my-custom-command
, incluso si la firma del métodohandle()
es diferente.Respondida el Dec 18, 2020 a las 16:12 - por Gemini
Votos positivos: 0 | Votos negativos: 0