Laravel Task
2 min read

Laravel Task

Una forma sencilla de desencadenar tareas validades y autorizadas.
Laravel Task

🇬🇧 Here you can find all the documentation in english.

Este paquete te da una forma sencilla de ejecutar ciertas tareas de forma aislada con toda la lógica necesaria organizada, estructurada y aislada. Estas tareas pueden ejecutarse desde un comando, un controlador o desde cualquier otro sitio de la aplicación.

Este es un paquete que creado para cubrir mis propias necesidades y, viendo que me ha sido muy útil y que últimamente lo incorporo en todos mis proyectos, he decido liberarlo. Si te gusta este paquete o te resulta útil puedes colaborar con donaciones o simplemente mejorando el repositorio colaborando directamente desde github.


Instalación

Puedes añadir la librería a tu instalación de Laravel usando composer.

composer require victor-falcon/laravel-task

¿Cómo lanzar y definir tareas?

1. Uso básico

Crea una tarea con el comando de task:make:

artisan task:make Shop/CreateUserShop
Puedes pasar una ruta como `Shop/CreateUserShop` para crear la tarea en una subcarpeta o directamente el nombre de la clase. La ruta por defecto es app/Tasks aunque la puedes personalizar publicando y modificando el archivo de configuración.
<?php

declare(strict_types=1);

namespace App\Tasks\Shop;

use VictorFalcon\LaravelTask\Task;
use VictorFalcon\LaravelTask\Taskable;

final class CreateUserShop implements Task
{
	use Taskable;

	private User $user;

	public function __construct(User $user)
	{
		$this->user = $user;
	}

	public function handle(ShopCreator $creator): Shop
	{
		// Create your shop
	}
}

Una vez tengas definida tu taréa puedes ejecutarla en cualquier parte del código con:

$shop = CreateUserShop::trigger($user);

2. Pasando datos con validación

Si quieres puedes pasar y validar datos en tus tareas usando el validador incluido en Laravel. Por ejemplo, si necesitas crear un usuario y asegurarte de que el nombre y el email tienen un formato concreto puedes hacer algo así.

final class CreateUser implements Task
{
	public function rules(): array
	{
		return [
			'name' => 'required|string|min:5',
			'email' => 'required|email|unique:users,email',
		];
	}

	public function handle(): User
	{
		return User::create($this->data);
	}
}

Y luego simplemente lanzar la tarea con datos validados. Todos los datos resultantes de la validación los tendrás disponibles en `$this->data`.

CreateUser::trigger()->withValid([
	'name' => 'Víctor Falcón',
	'email' => 'hi@victorfalcon.es',
]);

Puedes personalizar los mensajes con el método messages(): array en tu taréa o añadir atributos personalizados con  customAttributes(): array.

También puedes cambiar la bolsa de errores declarando y modificando la propiedad  string $errorBag en tu tarea.

3. Con autorización

A veces necesitamos validar que un determinado usuario tiene permisos antes de realizar una tarea determinada. Podemos hacer esto usando el método authorize(): bool en la tarea. Si devuelve false una excepción del tipo AuthorizationException será lanzada y la tarea no se ejecutará.

public function authorize(): bool
{
	return $this->user()->can('create', Product::class);
}

En cualquier punto de la tarea puedes acceder a $this->user() que será el usuario autenticado o remplazarlo con cualquier otro usuario:

CreateProduct::trigger()->by($user);

4. Obtener una respuesta

Por defecto las tareas no devuelven ninguna respuesta. Si necesitas obtener el resultado del método handle() de tu tarea simplemente debes llamar a result() .

// Esto retorna el resultado del método `handle` de la tarea
$product = CreateProduct::trigger()->withValid($data)->result();

Generar autocompletado en el IDE

Para hacer el desarrollo más sencillo y que el IDE sepa en todo momento los tipos de entrada y salida de nuestras taréas tenemos disponibl el comando artisan task:ide-help.

Este generará un archivo _ide_helper_tasks.php con toda la información necesaria de forma automática.